0

这是来自苹果开发人员示例的(简化的)类声明:

@interface myController : UITableViewController {

    NSArray *samples;
}

@property (nonatomic, retain) NSArray *samples

声明的目的是什么

{

    NSArray *samples;
}

当您再次将其声明为财产时?如果您遗漏:

{

    NSArray *samples;
}

您仍然可以@synthesize在您的 .m 中使用并获得对它的引用!

我对第一次声明的目的有点困惑。

谢谢

4

2 回答 2

3

属性只是为您的数据声明访问器的一种便捷方式。它通常会导致一些成员变量,但不一定。并且该成员 var 可以具有不同的名称:

@interface myController : UITableViewController {

    NSArray *mSamples;
}

@property (nonatomic, retain) NSArray *samples
@end

@implementation
@synthesize samples = mSamples;
@end

或者您可以使用完全没有 var 的属性:

@interface myController : UITableViewController {

}

@property (nonatomic, retain) NSArray *samples
@end

@implementation
   -(NSArray*) samples {
    //you can for example read some array from file and return it
   }

   -(void) setSamples:(NSArray*) arr {
     //write that array to file or whatever you want
    }
@end

使用新的编译器,您可以使用完全没有 ivars 的属性,编译器会为您隐式生成它们。

于 2012-12-07T06:03:11.820 回答
1

使用属性声明,显式声明支持实例变量没有任何目的或好处。这只是习惯的残余。

编辑:对于 iOS 或 Mac 64 位 Intel,属性永远不需要显式声明 ivars。但它们是其他 Mac 工作所需要的——因此是示例。

另外,我确实发现了不同之处。当显式声明 ivar 时,除非您另有说明,否则它是受保护的 ivar,可用于子类。但是当为属性隐式创建 ivar 时,子类无权访问 ivar。

于 2012-12-07T06:02:04.080 回答