iOS开发属性特质

原子性

atomic (原子性)(系统默认): 使用同步锁。能够保证赋值和获取是线程安全的。但不能保证操作和访问是线程安全的。
nonatomic (非原子性): 不适用同步锁。
在 iOS 开发中一般使用 nonatomic ,因为在 iOS 中使用同步锁的开销较大,可能会带来性能问题,而且使用atomic不能保证线程安全。

读写权限

readwrite (读写)(系统默认):可读可写,属性拥有 gettersetter 方法,如果该属性由 @synthesize 实现,编译器会自动生成gettersetter 方法。
readonly (只读):只能读取,不能写入,属性仅拥有 getter 方法。

内存管理语义

assign:“设置方法”,只会执行针对基本数据类型的赋值操作。

 1)assign修饰基本数据类型 
 2)修饰对象类型时不改变其引用计数  
 3)assign 修饰的对象在被释放之后,assign指针仍然指向原对象地址,会产生悬垂指针

strong:表明属性定义了一种“拥有关系”,为这种属性设置新值时,设置方法会先保留新值,释放旧值,然后再将新值赋值上去。
copy:表明属性定义了一种“拥有关系”,为这种属性设置新值时,设置方法不会保留新值,而是将新值拷贝一份。
当属性类型为 NSStringNSArray, NSDictionary) 时,经常使用copy 的特性保护其封装性。因为传递给设置方法的新值可能是指向一个 NSMutableString 类的实例,它表示是一个可修改的字符串,如果不拷贝字符串,那么在属性设置完之后,字符串的值可能在对象不知情的情况下遭到修改。所以此时就要 copy 一份不可变的字符串,确保属性设置完新值后不会被无意间改动。
备注:1)如果可变类型集合或字符串,比如NSMutableArray使用copy修饰后,对变量进行可变操作,比如addObject:时候,会出现错误,因为使用copy时,生成的是一个不可变对象。
2)如果对系统类或者自定义类使用copy进行修饰,需要实现NSCopying协议。

copy

1) 可变对象的copy和mutableCopy都是深拷贝
2) 不可变对象的copy都是浅拷贝,mutableCopy是深拷贝
3)mutableCopy返回的都是可变对象,copy返回都为不可变

weak:表明属性定义了一种“非拥用有关系”,为这种属性设置新值时,设置方法既不保留新值,也不会释放旧值。在属性所指对象遭到销毁时,属性值会清空(即被赋值为nil)。

 1)不改变被修饰对象的引用计数
 2)所指对象在被释放之后会自动置为nil

unsafe_inretained:(语义与 assign 相同,它适用于对象类型)表明属性定义了一种“非拥有关系”,只会执行对对象类型的赋值操作。当目标对象遭到摧毁时,属性值不会自动清空。

方法名

getter=<name>:指定获取方法的方法名。
setter=<name>:指定设置方法的方法名。

查阅资料《 Effective Objective-C 2.0 编写高质量 iOS 和 OS X 代码的52个有效方法》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • “属性”(property)是Objective-C的一项特性,用于封装对象中的数据。使用属性之后,编译器会自动写...
    sculg阅读 1,805评论 0 0
  • 使用属性时还有一个问题要注意,就是其各种特质设定也会影响编译器所生成的存取方法,属性可以拥有的特质分为四类: 原...
    HAPPY小元宝阅读 2,635评论 0 0
  • 不知道什么时候起,可能是小编我开始看电视,且看的懂电视时开始的吧~在我的脑海里就留下一个深刻的印象: 进入公司工作...
    大鱼透视军阅读 4,938评论 0 0
  • 品牌是符号,超级品牌就是超级符号。 现在我们能记住的许多大品牌,其实并非记住了他们的品牌名称(当然也说的出来),更...
    夏达人阅读 3,754评论 0 0
  • 61 大雁走了 麻雀快活了 你走了 世界萧条了 62 在落叶下到来的孩子 最坚强 他带着天空的信息 寒冷不会远了 ...
    东者西迷阅读 1,189评论 0 1

友情链接更多精彩内容