使用ARC,@ property是必需的

时间:2012-02-17 16:49:35

标签: ios automatic-ref-counting

使用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...];

6 个答案:

答案 0 :(得分:2)

属性是Objective Orientation Programming的一部分。这是封装!他们怎么不能用?!始终使用属性来封装数据。

答案 1 :(得分:2)

@ property / @ synthesize对自动生成getter和setter,从而提供封装。

当然,通常现在可能不需要这种封装,但是将来你可能会决定向iVar添加一些延迟初始化,或者想要在iVar的内容发生变化时发布通知。总是使用属性和合成或手写访问器是一个好习惯,成本可以忽略不计。为什么使用它们?

(如果您担心@ property / @ synthesize是太多样板,并且您有Mac Dev帐户,请查看Beta论坛。)

答案 2 :(得分:2)

内存管理不是使用属性的唯一优势。

我想到的两个特别是:

  1. KVO(无需手动拨打willChangeValueForKey:didChangeValueForKey: - 请参阅Manual Change Notification
  2. 能够为setter和getter编写自定义逻辑,以及为setter和getter编写子类自定义。
  3. bbum在iOS: must every iVar really be property?

    中写了一篇很好的回复

答案 3 :(得分:0)

我认为属性仍然用于自动生成不使用@public的访问器和更改器。

答案 4 :(得分:0)

在界面中使用@property,因为这是广告公共访问。如果您不想实际将其设为公开,请将@property声明放在类扩展名或.m文件中的@implementation中的ivar声明中。

答案 5 :(得分:0)

在objective-c中,@ property是标准setter的缩写和/或类中变量的getter。因此,无论您的ARC选项是开启还是关闭,您都可以在方便时做出选择。