使用ARC时,默认情况下每个指针赋值都会保留。在这种情况下,在非原子的情况下,为什么我甚至需要声明属性?
这两者有何不同?
//Property
@interface I1 : NSObject
@property (nonatomic, strong) NSString* str;
@end
I1 *obj1 = ...;
obj1.str = [[NSString alloc] init...];
//Only member variable
@interface I2 : NSObject {
@public
NSString* str;
}
@end
I2 *obj2 = ...;
obj2->str = [[NSString alloc] init...];
答案 0 :(得分:2)
属性是Objective Orientation Programming的一部分。这是封装!他们怎么不能用?!始终使用属性来封装数据。
答案 1 :(得分:2)
@ property / @ synthesize对自动生成getter和setter,从而提供封装。
当然,通常现在可能不需要这种封装,但是将来你可能会决定向iVar添加一些延迟初始化,或者想要在iVar的内容发生变化时发布通知。总是使用属性和合成或手写访问器是一个好习惯,成本可以忽略不计。为什么不使用它们?
(如果您担心@ property / @ synthesize是太多样板,并且您有Mac Dev帐户,请查看Beta论坛。)
答案 2 :(得分:2)
内存管理不是使用属性的唯一优势。
我想到的两个特别是:
willChangeValueForKey:
和didChangeValueForKey:
- 请参阅Manual Change Notification)答案 3 :(得分:0)
我认为属性仍然用于自动生成不使用@public
的访问器和更改器。
答案 4 :(得分:0)
在界面中使用@property
,因为这是广告公共访问。如果您不想实际将其设为公开,请将@property
声明放在类扩展名或.m文件中的@implementation
中的ivar声明中。
答案 5 :(得分:0)
在objective-c中,@ property是标准setter的缩写和/或类中变量的getter。因此,无论您的ARC选项是开启还是关闭,您都可以在方便时做出选择。