2

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

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

我已经尝试将类别用于 SomeUIView 的私有内部头文件,但我一直遇到“类 'SomeUIView' 的重复接口声明”。

有谁知道如何做到这一点?

谢谢!

4

2 回答 2

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
于 2010-05-26T00:29:01.637 回答
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;
于 2010-12-16T16:38:24.553 回答