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 NSString或NSArray(和其他集合)可能导致细微且难以发现的错误.
| 归档时间: |
|
| 查看次数: |
2719 次 |
| 最近记录: |