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

发布于 2024-09-03 03:35:15 字数 529 浏览 4 评论 0原文

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

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

我尝试过使用 SomeUIView 的私有内部头文件的类别,但我一直遇到“类‘SomeUIView’的重复接口声明”。

有谁知道该怎么做?

谢谢!

I'm creating a static library to share using the following guide:
http://www.amateurinmotion.com/articles/2009/02/08/creating-a-static-library-for-iphone.html

In one of the functions, I return a "SomeUIView" which is a subclass of UIView and is defined in the public header, however I don't want to expose the internal instance variable of SomeUIView in the public header.

I've tried using categories for a private internal header file for SomeUIView, but I keep running into "Duplicate interface declaration for class 'SomeUIView'".

Does anyone know how to do this?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

成熟的代价 2024-09-10 03:35:15

类别和扩展不能向类添加实例变量。我会在这里使用 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

Categories and extensions can't add instance variables to a class. I'd go for the PIMPL idiom here - use a private implementation object:

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

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

// ... etc.

This also keeps your public interface stable in case you want to add something for internal use.

The "duplicate interface" comes from missing parentheses in the second interface declaration:

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

// implementation file:
@interface MyObj () // note the parentheses which make it a class extension
// ...
@end
握住你手 2024-09-10 03:35:15

您还可以使用 Objective-C 2 称为“关联引用”的功能。

这并不是真正的面向对象的 API,但是您可以通过使用运行时的一些简单函数来向另一个对象添加/删除对象:

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

设置值或在值为 nil 时删除它。

id objc_getAssociatedObject(id object, void * key)

检索指定键的值。

请注意,这也是在实现类别时向现有对象添加“实例变量”的方法。

关键是指向私有变量的简单指针,您可以使用以下方法将其声明为模块私有:

static char SEARCH_INDEX_KEY = 0;

You may also use the Objective-C 2 feature known as "Associative reference".

This is not really object-oriented API, but you can add/remove object to another object by using some simple functions of the runtime:

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

Sets the value or remove it when value is nil.

id objc_getAssociatedObject(id object, void * key)

Retrieve the value for specified key.

Note that this is also a mean to add "instance variable" to existing object when implementing a category.

Key is s simple pointer to private variable that you can declare as a module private by using:

static char SEARCH_INDEX_KEY = 0;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文