首页
学习
活动
专区
圈层
工具
发布

目标
EN

Stack Overflow用户
提问于 2014-08-25 20:02:07
回答 3查看 4.9K关注 0票数 5

我是目标C的新手,所以如果在某个地方重复这件事,我很抱歉。我有一个类别(?)这大概是:

内部SomeClass.h

代码语言:javascript
复制
@interface SomeClass (SomeCategory) <SomeDelegate>
@property (nonatomic, retain) id somePublicProperty;
@property (nonatomic, retain) id someProperty; // <-- i want to move this to "private"
@end

现在在我的SomeClass.m里,我所拥有的就是:

代码语言:javascript
复制
@implementation SomeClass (SomeCategory)

// dynamic setters/getters here for someProperty.

@end

我认为someProperty是公开的。我该怎么让这个“私密”呢?(换句话说,如何在语法上将其放入.m文件?我试着用

代码语言:javascript
复制
@interface SomeClass (SomeCategory) {
    @property (nonatomic, retain) somePrivateProperty;
} 
@end

但它只是抱怨说,我对这一类别有重复的定义。我该如何正确地做这件事?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-25 20:08:36

只需在实现块外的.m文件中添加类别定义即可。

就像这样:

代码语言:javascript
复制
@interface MyClass (MyCategory)
@property (assign) BOOL myPrivateProperty;
@end

@implementation MyClass
...
@end
票数 2
EN

Stack Overflow用户

发布于 2014-08-25 20:07:56

在您的.h文件中,不应该给出类别。只需使用:

代码语言:javascript
复制
@interface SomeClass : SomeBaseClass < SomeDelegate>
    @property (nonatomic, retain) id somePublicProperty;
@end

.m文件中,在类扩展中定义私有属性

代码语言:javascript
复制
@interface SomeClass ()
    @property (nonatomic, retain) id somePrivateProperty;
@end

类扩展不是一个类似的类别,因为它允许您扩展接口以及向类添加新的存储。

在类类别中,您可以定义新属性,但不会为其分配任何存储空间。,所以您必须手工完成它:

代码语言:javascript
复制
@interface SomeClass (SomeBaseCategory)
    @property (nonatomic, retain) id somePrivateProperty;
@end

@implementation SomeClass {
    id _somePrivateProperty;
}

    - (void)setSomePrivateProperty:(id)property {

        _somePrivateProperty = property;
    }

    - (id)somePrivateProperty {
         return _somePrivateProperty;
    }

@end

否则你的应用程序就会崩溃。

无论如何,请记住,鉴于object的动态特性,您的属性永远不会完全私有,因为您始终可以通过objc_msgsend向object对象发送消息,从而设置或读取属性值。

编辑:

如果您没有类实现的源代码,则无法定义类扩展(如上面所链接的源)。

在这种情况下,可以使用对象关联来定义属性。

票数 8
EN

Stack Overflow用户

发布于 2014-08-25 23:48:53

类别最好用于向您不拥有且不能更改的代码中添加功能。通过类别添加属性不是不可能的,但要困难得多。

类扩展最好用于保持对象所需的属性,但不打算公开。

如果确实需要向该对象添加属性,则使用object运行时的关联对象进行操作。

关于何时/如何使用它们,这里有很好的说明

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25493491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档