iPhone静态库:如何隐藏实例变量

时间:2010-05-26 00:14:28

标签: iphone objective-c static-libraries private-members

我正在使用以下指南创建要共享的静态库: http://www.amateurinmotion.com/articles/2009/02/08/creating-a-static-library-for-iphone.html

在其中一个函数中,我返回一个“SomeUIView”,它是UIView的子类,并在公共头中定义,但我不想在公共头中公开SomeUIView的内部实例变量。

我已尝试为SomeUIView使用私有内部头文件的类别,但我一直在运行“类'SomeUIView'的重复接口声明”。

有谁知道怎么做?

谢谢!

2 个答案:

答案 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;