iOS之属性关键字

属性关键字可以分为三种类型:

        1.读写权限的类型: readonly ,readwrite

        2.原子类 : atomic ,nonatomic

        3.引用计数 : retain/strong/copy,assign/unsafe_unretained,weak

读写权限的类型: readonly ,readwrite

        readwrite 是可读可写特性;会自动生成getter方法和setter方法

        readonly 是只读特性 只会生成getter方法 ,不会生成setter方法    

原子类: atomic nonatomic

        atomic是保证赋值和获取是线程安全的。 这里说的是对成员属性的直接赋值和获取,并代表操作和访问。 对于atomic的属性,系统生成的 getter/setter 会保证 get、set 操作的完整性,不受其他线程影响。atomic对一个数组,进行赋值或获取,是可以保证线程安全的。但是如果数组进行操作,比如给数据加对象或移除对象,是不在atomic的保证范围。

引用计数

        retain/strong:修饰objc数据类型,其引用计数+1,修饰的对象被释放后,引用计数-1

        assign:修饰基本数据类型,修饰对象类型时,不改变其引用计数,会产生悬垂指针,修饰的对象在被释放后,assign指针仍然指向原对象内存地址,如果使用assign指针继续访问原对象的话,就可能会导致内存泄漏或程序异常

        weak:不改变被修饰对象的引用计数,所指对象在被释放后,weak指针会自动置为nil

        copy:分为深拷贝和浅拷贝

            浅拷贝:对内存地址的复制,让目标对象指针和原对象指向同一片内存空间会增加引用计数

            深拷贝:对对象内容的复制,开辟新的内存空间

注:可变对象的copy和mutableCopy都是深拷贝;不可变对象的copy是浅拷贝,mutableCopy是深拷贝;copy方法返回的都是不可变对象。

下面我们来说一说面试会被问到的知识点:


Q:@property (nonatomic, copy) NSMutableArray * array;这样写有什么影响?

A:copy方法返回的都是不可变对象,所以array对象实际上是不可变的,如果对其进行可变操作如添加移除对象,则会造成程序crash


Q:strong和weak的区别?

A:strong 表示指向并拥有该对象。其修饰的对象引用计数会加1.该对象只要引用计数不为0则不会被销毁。当然强制将其置为nil也可以销毁它。 weak 表示指向但不拥有该对象。其修饰的对象引用计数不会增加。无需手动设置,该对象会自行在内存中销毁。


Q:assign 和weak的区别?

A:1、assign可以修饰对象和基本数据类型, weak只修饰对象

    2、assign 所修饰的对象被释放后,还会指向原对象内存地址。weak 所修饰的对象被废弃之后,weak 所修饰对象会被设置为nil。


Q:浅拷贝和深拷贝的区别?

A:浅拷贝增加引用计数,不产生新的内存。 深拷贝不增加引用结束,会新分配内存

你可能感兴趣的:(iOS之属性关键字)