[英]objective-C how to declare private property for category?
我是Objective-C的新手,如果在某个地方重复这一点,请道歉。 我有一个类别(?),如:
在SomeClass.h
:
@interface SomeClass (SomeCategory) <SomeDelegate>
@property (nonatomic, retain) id somePublicProperty;
@property (nonatomic, retain) id someProperty; // <-- i want to move this to "private"
@end
现在在我的SomeClass.m
,我只有:
@implementation SomeClass (SomeCategory)
// dynamic setters/getters here for someProperty.
@end
我认为someProperty
是公开的。 我如何让这个“私人”? (换句话说,我如何在语法中将它放在.m
文件中?我试图使用
@interface SomeClass (SomeCategory) {
@property (nonatomic, retain) somePrivateProperty;
}
@end
但它只是抱怨我有类别的重复定义。 我该怎么做?
在.h
文件中,您不应该提供类别。 只需使用:
@interface SomeClass : SomeBaseClass < SomeDelegate>
@property (nonatomic, retain) id somePublicProperty;
@end
在.m
文件中,在类扩展中定义私有属性:
@interface SomeClass ()
@property (nonatomic, retain) id somePrivateProperty;
@end
类扩展不是类似的类,因为它允许您扩展接口以及向类添加新存储。
在类类别中, 您可以定义新属性,但不会为其分配存储空间 ,因此您必须手动执行:
@interface SomeClass (SomeBaseCategory)
@property (nonatomic, retain) id somePrivateProperty;
@end
@implementation SomeClass {
id _somePrivateProperty;
}
- (void)setSomePrivateProperty:(id)property {
_somePrivateProperty = property;
}
- (id)somePrivateProperty {
return _somePrivateProperty;
}
@end
否则你的应用程序将崩溃。
在任何情况下,请记住,鉴于Objective-C的动态特性,您的属性永远不会完全私有,因为您始终可以通过objc_msgsend
向Objective-C对象发送消息,从而设置或读取属性值。
编辑:
如果您没有类实现的源代码,则无法定义类扩展(根据上面链接的源)。
在这种情况下, 您可以使用对象关联来定义属性 。
只需在实现块外的.m文件中添加类别定义即可
像这样:
@interface MyClass (MyCategory)
@property (assign) BOOL myPrivateProperty;
@end
@implementation MyClass
...
@end
类别最适合用于添加您不拥有且无法更改的代码的功能。 通过类别添加属性并非不可能,但要困难得多。
类扩展最适合用于保存对象所需的属性,但不是公开的。
如果确实需要向此对象添加属性,那么执行此操作的方法是使用Objective-C运行时的关联对象
还有的时候/如何使用它们的优秀的书面记录在这里
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.