有没有办法在Objective C中声明私有属性?目标是从合成的getter和setter中获益,实现某种内存管理方案,但不会暴露给公众。
尝试在类别中声明属性会导致错误:
@interface MyClass : NSObject {
NSArray *_someArray;
}
...
@end
@interface MyClass (private)
@property (nonatomic, retain) NSArray *someArray;
@end
@implementation MyClass (private)
@synthesize someArray = _someArray;
// ^^^ error here: @synthesize not allowed in a category's implementation
@end
@implementation MyClass
...
@end
答案 0 :(得分:97)
我实现了这样的私有属性。
MyClass.m
@interface MyClass ()
@property (nonatomic, retain) NSArray *someArray;
@end
@implementation MyClass
@synthesize someArray;
...
这就是你所需要的一切。
答案 1 :(得分:10)
A. 如果您想要一个完全私有的变量。不要给它一个财产 B. 如果您想要一个可从类封装外部访问的只读变量,请使用全局变量和属性的组合:
//Header
@interface Class{
NSObject *_aProperty
}
@property (nonatomic, readonly) NSObject *aProperty;
// In the implementation
@synthesize aProperty = _aProperty; //Naming convention prefix _ supported 2012 by Apple.
使用readonly修饰符,我们现在可以在外部的任何地方访问该属性。
Class *c = [[Class alloc]init];
NSObject *obj = c.aProperty; //Readonly
但在内部我们无法在Class中设置aProperty:
// In the implementation
self.aProperty = [[NSObject alloc]init]; //Gives Compiler warning. Cannot write to property because of readonly modifier.
//Solution:
_aProperty = [[NSObject alloc]init]; //Bypass property and access the global variable directly
答案 2 :(得分:6)
正如其他人所指出的那样,(目前)无法在Objetive-C中真正宣布私有财产。
您可以尝试以某种方式“保护”属性的一个方法是使基类具有声明为readonly
的属性,并且在子类中,您可以重新声明与{{1}相同的属性}。
Apple的重新声明属性文档可在此处找到:http://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW19
答案 3 :(得分:5)
这取决于你所说的“私人”。
如果您的意思是“没有公开记录”,您可以轻松地在私有标头或.m文件中使用class extension。
如果你的意思是“别人根本无法打电话”,那你就不走运了。任何人都可以在知道其名称的情况下调用该方法,即使它没有公开记录。