正确的声明属性的方法

时间:2013-08-02 10:39:39

标签: ios properties

我对指定强,复制或分配而不指定它们感到困惑。我们不使用NIB文件。我的同事总是使用以下内容 - 他说iOS会检测到并自动使用它强弱等等。

@interface viewController : UIViewController
   @property (nonatomic) UIImageView *imageView1;
   @property (nonatomic) NSUInteger num;
   @property (nonatomic) NSArray *array;
@end

我更喜欢按照以下方式进行操作。

@interface viewController : UIViewController
   @property (nonatomic, strong) UIImageView *imageView1;
   @property (nonatomic, assign) NSUInteger num;
   @property (nonatomic, copy) NSArray *array;
@end

哪一种编程风格更好?第一个选项总是具有强类型,因为它默认,但我总是明确指定它们。

3 个答案:

答案 0 :(得分:3)

正如前面的答案中所指出的,默认情况下,Objective C属性是

  • atomic, strong/retain, readwrite - >对于指针类型
  • atomic, assign, readwrite - >对于原始类型

属性类型weakcopy需要由程序员明确指定,并且不会自动决定。

每个人的意思是什么,

  • strong / retain引用的对象在内存中保持活动状态,直到指定为止。
  • 当没有强引用时,
  • weak引用的对象将被销毁。通常用于引用delegate个对象。
  • copy将创建分配给属性的对象的浅表副本。
  • assign / usafe_unretained(ARC)分配值。如果在指针类型的情况下使用,这是一个不安全的未指定的指针赋值。在ARC中,通常使用weak作为指针类型,因为它会使ivar=nil一次weak引用的对象被销毁。在这种情况下assign将导致悬空指针。

就个人而言,我更喜欢指定属性类型,即使它默认为strong。这增加了可读性,特别是在分析内存泄漏或调试崩溃的应用程序时,它非常方便。

您可以阅读有关properties here的更多信息。

希望有所帮助。

答案 1 :(得分:0)

使用ARC,默认为强,所以两者在技术上是相同的。来自Transitioning to ARC Release Notes

__strong is the default. An object remains “alive” as long as there is a strong pointer to it.

请注意,ARC会 NOT 自动检测何时需要弱点。

我倾向于明确,就像你的第二个例子,但我认为这主要是风格/习惯问题。

答案 2 :(得分:0)

属性的默认值为strong变量的默认值为__strong。在您当前的示例中,推荐的属性实际上是weak,但strong也是可接受的。

对于非基元的属性,您不应再使用assign,而应使用unsafe_unretained。实际上它们是相同的,但后者让你知道你不安全地使用了一个物体。

copy属性表示复制对象(使用copy方法)并且不保留。建议用于NSStringNSArray等具有可变形式的类。这是因为您不想保留您认为不可变的字符串,但实际上是在其他地方更改。

assign属性声明只应用于基本类型和结构,例如intCGSize