我正在使用以下指南创建要共享的静态库: http://www.amateurinmotion.com/articles/2009/02/08/creating-a-static-library-for-iphone.html
在其中一个函数中,我返回一个“SomeUIView”,它是UIView的子类,并在公共头中定义,但我不想在公共头中公开SomeUIView的内部实例变量。
我已尝试为SomeUIView使用私有内部头文件的类别,但我一直在运行“类'SomeUIView'的重复接口声明”。
有谁知道怎么做?
谢谢!
答案 0 :(得分: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
答案 1 :(得分:0)
您也可以使用Objective-C 2功能,称为“关联参考”。
这不是真正面向对象的API,但您可以使用运行时的一些简单函数将对象添加/删除到另一个对象:
void objc_setAssociatedObject(id object, void * key, id value)
设置值或在值为nil时将其删除。
id objc_getAssociatedObject(id object, void * key)
检索指定键的值。
请注意,这也是在实现类别时向现有对象添加“实例变量”的意思。
Key是指向私有变量的简单指针,您可以使用:
将其声明为私有模块static char SEARCH_INDEX_KEY = 0;