合成没有实例变量的属性

时间:2010-12-22 17:12:18

标签: objective-c

我以为我理解了@property和@synthesize,但我做了一些实验,但我无法弄清楚为什么下面(我认为被破坏的)代码有效。

如您所见,没有与name属性对应的实例变量。如果Objective-C没有找到具有相同名称和类型的实例变量,它会以某种方式创建一个实例变量吗?

部首:

#import <Foundation/Foundation.h>

@interface AddressCard : NSObject {

}

@property (copy, nonatomic) NSString *name;
-(void) print;

@end

实现:

#import "AddressCard.h"

@implementation AddressCard

@synthesize name;

-(void) print {
    NSLog(@"Name=%@", self.name);
}

-(void) dealloc {
    [name release];
    [super dealloc];
}

@end

测试:

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    AddressCard *ac = [[AddressCard alloc] init];
    ac.name = @"Brandon";
    [ac print];

    [ac release];

    [pool drain];
    return 0;
}

3 个答案:

答案 0 :(得分:25)

快速回答是:“是”。在Objective-C 2.0中,合成属性将根据需要自动创建相应的ivars。

Apple's documentation有更多细节。

重要提示: 正如Tommy所指出的那样(注意:这是来自旧版文档 - 请参阅{{3 }}):

  

在Objective-C 2.0中,任何一个现代运行时(即Intel 64位和ARM)属性都可以“动态”添加到类中(即,在运行时但仅在创建任何实例之前 - 不是特别动态比较到运行时的其余部分)。但是,这不能在两个较旧的运行时(即Intel 32位和PowerPC)中的任何一个上完成。因此,您不希望在Mac的运输软件或iOS开发期间使用它(因为模拟器是32位英特尔应用程序,无法在运行时创建实例变量)

答案 1 :(得分:2)

您只能为64位架构省略实例变量声明

答案 2 :(得分:0)

我想补充一点,虽然实例变量是自动创建的,但它的名称与属性相同。通过这样做,您可能会在以后的代码中遇到错误。因此,除了防止在某些体系结构上不自动生成的情况之外,您应该始终创建实例变量,以便以后不会出现任何意外情况。