美文网首页
ios开发笔记(1)-@property的属性描述

ios开发笔记(1)-@property的属性描述

作者: 66be37b2096c | 来源:发表于2016-07-28 11:03 被阅读178次

    示例1:

    @property (nonatomic) BOOL property;

    nonatomic表示不考虑多线程,编译器不生成互斥加锁的代码,可以提高效率,缺点是在多线程环境下存在风险,可能会出现读写不同步问题。

    与之对应的atomic则考虑多线程,编译器会生成互斥加锁的代码,可以避免在多个线程下操作同一资源造成的死锁、读写不同步问题,该属性默认实现,如使用nonatomic则不实现,缺点是效率低。

    总结:多线程使用atomic,单线程使用nonatomic。

    注:以下示例仅在单线程环境下

    示例2:

    @property (nonatomic, assign) BOOL property;

    等价于@property (nonatomic) BOOL property; assign是默认类型,只能修饰基本类型和C数据类型,不改变引用计数。

    tip: @property BOOL property; 等价于@property (atomic, assign) BOOL property;

    示例3:

    @property (nonatomic, retain) NSString *property;

    @property (nonatomic, copy) NSString *property;

    retain会在setter方法里将旧对象释放并将旧对象的值赋给新对象,另外新对象的引用计数为1,指针指向新对象。copy和retain处理流程一样,不同的是copy将新生成指针指向新对象,被定义有copy属性的对象必须要符合NSCopying协议,必须实现- (id)copyWithZone:(NSZone *)zone方法。

    示例4:

    @property (nonatomic, strong) NSString *property;

    @property (nonatomic, weak) NSString *property;

    strong表示强引用,可以决定对象的生命周期,只要对象有强引用存在,就不会被释放。

    weak表示弱引用,不能决定对象的生命周期,只要对象不存在强引用,即使有多个弱引用存在,对象依然会被释放。

    示例5:

    @property (nonatomic, assign, getter=methodget) BOOL property;

    getter=methodget表示替换默认setter方法,原setter方法不再有效,methodget方法内部实现可重写,类似getter方法也可以在声明的时候替换如:@property (nonatomic, assign, getter=methodget, setter=methodSet:) BOOL property;

    鉴于篇幅,属性描述中还有其他声明如unretain-unsafe以及ios9以后新出的nonnull、nullable之类这里不再介绍,如有描述不当或者错误的地方欢迎大家指正,共同提升。

    相关文章

      网友评论

          本文标题:ios开发笔记(1)-@property的属性描述

          本文链接:https://www.haomeiwen.com/subject/fplajttx.html