令人困惑的Objective-C类结构

时间:2012-12-07 05:55:47

标签: objective-c

以下是来自apple开发人员的一个例子(简化):

@interface myController : UITableViewController {

    NSArray *samples;
}

@property (nonatomic, retain) NSArray *samples

声明

的目的是什么?
{

    NSArray *samples;
}

当您再次将其声明为属性时?如果你遗漏:

{

    NSArray *samples;
}

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

我对第一次宣言的目的感到有些困惑。

由于

2 个答案:

答案 0 :(得分:3)

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

@interface myController : UITableViewController {

    NSArray *mSamples;
}

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

@implementation
@synthesize samples = mSamples;
@end

或者你可以使用没有变量的属性:

@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的属性,编译器将隐式生成它们。

答案 1 :(得分:1)

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

编辑:对于iOS或Mac 64位Intel,明确声明属性永远不需要ivars。但是其他Mac工作需要它们 - 因此就是例子。

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