Dav*_* T. 5 private objective-c ios objective-c-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
Run Code Online (Sandbox Code Playgroud)
现在在我SomeClass.m,我所拥有的是:
@implementation SomeClass (SomeCategory)
// dynamic setters/getters here for someProperty.
@end
Run Code Online (Sandbox Code Playgroud)
我认为这someProperty是公开的.我如何让这个"私人"?(换句话说,我如何在语法上把它放在.m文件中?我试图使用
@interface SomeClass (SomeCategory) {
@property (nonatomic, retain) somePrivateProperty;
}
@end
Run Code Online (Sandbox Code Playgroud)
但它只是抱怨我有类别的重复定义.我该怎么做?
在您的.h文件中,您不应该提供该类别.只需使用:
@interface SomeClass : SomeBaseClass < SomeDelegate>
@property (nonatomic, retain) id somePublicProperty;
@end
Run Code Online (Sandbox Code Playgroud)
在您的.m文件中,在类扩展中定义您的私有属性:
@interface SomeClass ()
@property (nonatomic, retain) id somePrivateProperty;
@end
Run Code Online (Sandbox Code Playgroud)
类扩展不是类似的类,因为它允许您扩展接口以及向类添加新存储.
在类类别中,您可以定义新属性,但不会为其分配存储空间,因此您必须手动执行:
@interface SomeClass (SomeBaseCategory)
@property (nonatomic, retain) id somePrivateProperty;
@end
@implementation SomeClass {
id _somePrivateProperty;
}
- (void)setSomePrivateProperty:(id)property {
_somePrivateProperty = property;
}
- (id)somePrivateProperty {
return _somePrivateProperty;
}
@end
Run Code Online (Sandbox Code Playgroud)
否则你的应用程序将崩溃.
在任何情况下,请记住,鉴于Objective-C的动态特性,您的属性永远不会完全私有,因为您始终可以通过Objective-C对象发送消息objc_msgsend,从而设置或读取属性值.
编辑:
如果您没有类实现的源代码,则无法定义类扩展(根据上面链接的源).
在这种情况下,您可以使用对象关联来定义属性.
只需在实现块外部的 .m 文件中添加类别定义
就像这样:
@interface MyClass (MyCategory)
@property (assign) BOOL myPrivateProperty;
@end
@implementation MyClass
...
@end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4011 次 |
| 最近记录: |