目标C中的私有财产

时间:2011-04-13 00:26:10

标签: objective-c

有没有办法在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

4 个答案:

答案 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

如果你的意思是“别人根本无法打电话”,那你就不走运了。任何人都可以在知道其名称的情况下调用该方法,即使它没有公开记录。