2010-05-26 5 views
2

Я создаю статическую библиотеку, чтобы разделить с помощью следующего руководства: http://www.amateurinmotion.com/articles/2009/02/08/creating-a-static-library-for-iphone.htmliPhone статические библиотеки: Как скрыть экземпляр переменной

В одной из функций, я возвращаю «SomeUIView», который является подклассом UIView и определяется в публичном заголовке, однако я не хочу раскрывать внутреннюю переменную экземпляра SomeUIView в публичном заголовке.

Я попытался использовать категории для частного внутреннего заголовочного файла для SomeUIView, но я продолжаю работать в «Дублирование интерфейса для класса« SomeUIView ».

Кто-нибудь знает, как это сделать?

Спасибо!

ответ

3

Категории и расширения не могут добавлять переменные экземпляра в класс. Я бы пойти на Pimpl идиомы здесь - использовать частный объект реализации:

// header 
@class MyObjImpl; 
@interface MyObj { 
    MyObjImpl* impl; 
} 
@end 

// implementation file: 
@interface MyObjImpl { 
    id someIvar; 
} 
// ... 
@end 

// ... etc. 

Это также сохраняет свой открытый интерфейс стабильным в случае, если вы хотите добавить что-то для внутреннего использования.

«дубликат интерфейс» происходит из недостающих скобок во втором объявлении интерфейса:

// header: 
@interface MyObj 
// ... 
@end 

// implementation file: 
@interface MyObj() // note the parentheses which make it a class extension 
// ... 
@end 
+0

Обратите внимание, что частная реализация (прыщ ... мой второй любимый акроним рядом с NARC), выиграла Фактически, спрячься с иварами ... вы все равно можете добраться до них, если достаточно выкопаете во время работы. – bbum

0

Вы также можете использовать функцию Objective-C 2, известную как «Ассоциативные ссылки».

Это на самом деле не объектно-ориентированный API, но вы можете добавить/удалить объект к другому объекту, используя некоторые простые функции выполнения:

void objc_setAssociatedObject(id object, void * key, id value) 

Устанавливает значение или удалить его, когда значение равно нулю.

id objc_getAssociatedObject(id object, void * key) 

Извлечь значение для указанного ключа.

Обратите внимание, что это также означает добавление «переменной экземпляра» к существующему объекту при реализации категории.

Ключ S простого указателя на частные переменный, вы можете объявить как модуль частное с помощью:

static char SEARCH_INDEX_KEY = 0;