3

I am little confused about specifying strong, copy, or assign and not specifying them. We don't use NIB files. My colleague always use following - he says iOS detects it and use it automatically strong, weak etc.

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

I prefer following way doing it.

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

Which one is better programming style? First option always have strong type as it defaults but I always specifies them explicitly.

4

3 回答 3

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默认情况下也是如此。这增加了可读性,这在分析内存泄漏或调试崩溃的应用程序时特别方便。

您可以在此处阅读有关属性的更多信息。

希望有帮助。

于 2013-08-02T11:36:21.843 回答
0

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

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

copy属性意味着一个对象被复制(使用copy方法)而不是保留。建议用于NSStringNSArray等具有可变形式的类。这是因为您不想保留您认为是不可变字符串但实际上正在其他地方更改的内容。

assign属性声明应仅用于原始类型和结构,例如intCGSize

于 2013-08-02T10:57:18.680 回答
0

对于 ARC,strong 是默认设置,因此两者在技术上是相同的。从过渡到 ARC 发行说明

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

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

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

于 2013-08-02T10:48:38.067 回答