Objective-C属性属于最佳实践

Iul*_*rei 11 properties objective-c

在多次搜索和读取属性属性之后,我仍然无法完全理解它们并创建正确使用它们的反射.

我有几个问题:

1)default属性是什么意思?

据我所知,没有在"组"中指定属性,使用默认属性,因此:

@property NSString *string;
Run Code Online (Sandbox Code Playgroud)

atomic吧?

通过这个逻辑,这篇文章strong并且assign是默认值,所以如果我有:

@property (nonatomic) NSString *string;
Run Code Online (Sandbox Code Playgroud)

string物业strong还是assign

可用属性如何"分组"?或者像Xcode这样说,哪些属性是互斥的?

2)是否应遵循一般规则?

例如,我看到一条评论说你应该copy用于具有可变变体的类NSString,比如,NSArray.

另一个说你应该assign用于C对象.

所以,总是使用以下是一个好主意:

@property (copy, nonatomic) NSString *string;
@property (assign, nonatomic) CGFloat float;
Run Code Online (Sandbox Code Playgroud)

属性属性还有哪些其他标准做法?

3)如果我使用"错误"属性会出现什么问题?如果我只使用nonatomic项目中的所有属性怎么办?

rma*_*ddy 27

1a)属性的默认属性是atomic,和strong(对于对象指针)或assign(对于基本类型),和readwrite.这假设一个全ARC项目.

所以@property NSString *string;是一样的@property (atomic, strong, readwrite) NSString *string;.@property int value;是一样的@property (atomic, assign, readwrite) int value;.

1b)属性分组如下:

  • 原子/非原子
  • 强/弱/分配/副本
  • 读写/只读

从这三组中选择一个且仅一个.

实际上,最新的Objective-C增加nullable/nonnull了对默认值的支持nullable.

2)一般规则如你所说.

  • 对象指针通常应该是strong.
  • 原始类型应该是assign.
  • weak应该在子/父引用中使用以避免引用周期.通常,父母对其子女有强烈的引用,而子女对其父母的引用较弱.代表们通常也是weak出于同样的原因.
  • copy通常用于NSString,NSArray,NSDictionary等,以避免出现问题时,他们被赋予可变的变体.这避免了意外改变值的问题.
  • 有一个很大的"陷阱"使用copywith NSMutableString,NSMutableArray等等,因为当你将可变值赋给属性时,该copy属性会导致copy被调用的方法返回原始值的不可变副本.解决方案是覆盖setter要调用的方法mutableCopy.

3)根据属性的需要和使用的属性,使用错误的属性可能会出现严重问题.

  • 使用assign而不是strong对象指针可能是最糟糕的错误.由于尝试访问已释放的对象,它可能导致应用程序崩溃.

  • 使用nonatomic而不是atomic在多个线程上同时访问的属性可能会导致很难找到错误和/或崩溃.

  • 如果将可变变量分配给属性并且其他代码稍后修改这些值,则使用strong而不是copyfor NSStringNSArray(和其他集合)可能导致细微且难以发现的错误.