我对指定强,复制或分配而不指定它们感到困惑。我们不使用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
哪一种编程风格更好?第一个选项总是具有强类型,因为它默认,但我总是明确指定它们。
答案 0 :(得分:3)
正如前面的答案中所指出的,默认情况下,Objective C属性是
atomic, strong/retain, readwrite
- >对于指针类型atomic, assign, readwrite
- >对于原始类型属性类型weak
,copy
需要由程序员明确指定,并且不会自动决定。
每个人的意思是什么,
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
方法)并且不保留。建议用于NSString
和NSArray
等具有可变形式的类。这是因为您不想保留您认为不可变的字符串,但实际上是在其他地方更改。
assign
属性声明只应用于基本类型和结构,例如int
和CGSize
。