iOS开发:属性修饰符及copy与mutablecopy比较

来源:互联网 发布:linux常用查看命令 编辑:程序博客网 时间:2024/04/29 06:51

一 属性配置

(一) 属性访问限定符

@public 共有的

@private 私有的,子类也不能使用 

@protected 受保护的,子类可以使用

(二) 属性修饰符

1.线程相关

 atomic:原子访问,线程安全,效率不高

 nonatomic:非原子访问,线程不安全,效率高(默认)

2.内存相关

 ARC

 retain:修饰对象类型,表示强引用(持有一次,引用计数加一)

 assign:修饰基本数据类型,修饰对象类型时表示弱引用(引用计数不会加一)

 copy:修饰对象类型,表示拷贝,浅拷贝时相当于retain,深拷贝就是开辟新的空间

 ARC

 strong:强引用,修饰对象类型,相当于非ARC下的retain

 weak:弱引用,相当于assign

3.是否生成settergetter方法

 readwrite:可读可写,同时生成settergetter

 readonly:只读,只生成getter

二 copy与mutablecopy的简单分析

(一)深拷贝和浅拷贝

浅拷贝:拷贝指针,不开辟新的内存空间,相当于retain,该指针和原指针共同指向一个内容空间
深拷贝:拷贝内容,开辟新的空间,该指针指向这个空间

(二)copy和mutablecopy区别

不可变对象的copy是浅拷贝

        可变对象的copy是深拷贝,副本是不可变的

        不可变对象的mutablecopy是深拷贝,结果是可变的

        可变对象的mutablecopy也是深拷贝,结果是可变的

总结:只有不可变对象的copy是浅拷贝,copy的副本不可变,mutablecopy的副本可变。

(三)用copy修饰属性

由于不管对何种对象或数据类型的copy,所产生的副本都是不可变的,所以我们常常对不希望内容改变的属性(NSString NSArray NSDictionary等),用copy修饰,这样安全性更高。

(四)自定义拷贝

通过对- (id)mutableCopyWithZone:(NSZone *)zone;- (id)copyWithZone:(NSZone *)zone;方法进行重写,它们的区别在于一个返回的对象是可变的,一个是不可变的。这里需要注意的一点是,只有iOS原生的类才自动遵守NSCoding、NSCoping、NSMutablecoping协议,所以自定义类的时候,记得添加协议。

(五)伪复制

这个大家常说的伪复制不过是在重写copy协议方法的时候,不将一个对象的属性全部复制,而复制其中一部分,这也体现了copy的灵活性。

0 0
原创粉丝点击