You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 06:32:08