可能重复:
Property Declaration and Automatic Backing Storage Allocation
为什么编译器会接受类似的东西而不是给出错误?
#import <UIKit/UIKit.h>
@interface fubar : NSOjbect {
}
@property (nonatomic, retain) NSArray *array;
@end
线索赞赏。
另外,编辑评论......这是否会降低代码的可读性?
答案 0 :(得分:3)
编译器可以自动为您生成ivar。
在实现文件中,您应该找到类似这样的内容:
@synthesize array;
或
@synthesize array = _array;
我更喜欢第二种情况,因为ivar名称与属性名称不同,所以你被迫使用
self.array = anArray;
这样的事情无法编译:
array = anArray;
因为ivar名称是_array。
如果你问它是否不太可读 - 对我来说不是。我更喜欢自动生成ivars。
比较
#import <UIKit/UIKit.h>
@interface fubar : NSOjbect
@property (nonatomic, retain) NSArray *array;
@end
(我删除了花括号,因为在这种情况下它们不是必需的),用这个:
#import <UIKit/UIKit.h>
@interface fubar : NSOjbect {
NSArray *array
}
@property (nonatomic, retain) NSArray *array;
@end
对我来说,代码越少越好(更容易理解)。
答案 1 :(得分:1)
虽然工作正常,@synthesize
创建了ivar,但副作用是ivar在调试器中不可见。希望Apple能解决这个恼人的问题。
答案 2 :(得分:0)
属性不是实例变量就是简单的答案。
属性是一对setter / getter方法,如果他们愿意,可以设置/获取实例变量,但不必如此。
如果综合属性(即编译器自动创建setter和getter)并且实例变量不存在,编译器也会创建它。