Objective-C属性指定自定义属性后,是否保留默认配置?
Objective-C属性显式指定对默认配置的影响
核心结论
显式指定某类属性时,仅会覆盖对应类别的默认值,其他未指定的属性仍保持默认配置。但需注意:内存管理语义(strong/weak/assign/copy等)属于同一类别,同一属性只能指定其中一个,显式指定会直接替换该类别的默认值。
问题1:默认属性的等价性
对象类型的@property默认配置为atomic, readwrite, strong,因此以下两种声明完全等价:
@property(atomic,readwrite,strong)NSString *name; @property NSString *name;
问题2:仅指定assign时的属性配置
这两行不等价,且第二行写法存在语义冲突:
@property (assign) NSString* name; @property (assign,atomic,readwrite,strong) NSString * name;
原因:
assign属于内存管理语义类别,会直接覆盖默认的strong,因此第一行的内存语义是assign,不会持有对象,赋值后自然不会保留引用;- 同一属性不能同时指定
assign和strong(二者互斥),编译器会以最后指定的为准,但这种写法本身不符合规范。
问题3:修改部分默认属性后的等价性
这两行完全等价:
@property (nonatomic,weak) NSString * name; @property (nonatomic,weak,readwrite) NSString * name;
原因:
readwrite是访问控制类别的默认值,即使不显式指定,编译器也会自动添加;- 这里仅修改了原子性(
nonatomic替换默认的atomic)和内存语义(weak替换默认的strong),未指定的访问控制属性保持默认的readwrite,因此两行效果一致。
内容的提问来源于stack exchange,提问作者Zohar81
相关产品推荐
相关产品推荐

