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