目标 C 的私人财产

有没有办法在目标 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
56226 次浏览

我的私人财产就是这样实现的。

MyClass.m

@interface MyClass ()


@property (nonatomic, retain) NSArray *someArray;


@end


@implementation MyClass


@synthesize someArray;


...

这就够了。

正如其他人指出的那样,(目前)没有办法在 Objective-C 中真正声明私有属性。

您可以尝试以某种方式“保护”这些属性,其中之一是使用声明为 readonly的属性的基类,并且在您的子类中,您可以重新声明与 readwrite相同的属性。

苹果公司关于重申属性的文档可以在这里找到: http://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW19

这取决于你所说的“私人”是什么意思。

如果您的意思仅仅是“未公开记录”,那么您可以很容易地在私有头部或。M 档案。

如果你的意思是“其他人根本无法判断”,那你就不走运了。任何人都可以在知道方法名的情况下调用该方法,即使该方法没有公开的文档。

如果你想要一个完全私有的变量,不要给它一个属性。
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

但是在类内部我们不能设置属性:

// 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