属性和实例变量声明

Bru*_*sso 3 objective-c

我注意到你可以用这种方式"双重声明"一个变量:

@interface A {
    NSString *instanceVariable;
}
@property (nonatomic, retain) NSString *instanceVariable;
@end
Run Code Online (Sandbox Code Playgroud)

这与以下情况具有相同的效果:

@interface A {
}
@property (nonatomic, retain) NSString *instanceVariable;
@end
Run Code Online (Sandbox Code Playgroud)

为什么编译器不会在这种情况下抱怨?

Vla*_*mir 7

因为两种方式都有效.

通过声明属性来声明ivar是一个新的语言功能,可以从objc 2.0开始

" Objective-c编程语言"的"运行时差异"部分中,参考说明:

要使@synthesize在遗留运行时中工作,您必须提供具有相同名称和属性的兼容类型的实例变量,或者在@synthesize语句中指定另一个现有实例变量.对于现代运行时,如果您不提供实例变量,编译器会为您添加一个.