iOS属性关键字和相关的面试题

收录:空杯子


1:属性关键字是iOS开发中的基础,往往细节决定成败。

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


读写权限的类型: readonly ,readwrite

原子类 :  atomic ,nonatomic

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

读写权限的类型: readonly ,readwrite

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

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

原子类: atomic nonatomic

atomic是保证赋值和获取是线程安全的。 这里说的是对成员属性的直接赋值和获取,并代表操作和访问。 对于atomic的属性,系统生成的 getter/setter 会保证 get、set 操作的完整性,不受其他线程影响。

retain关键字


只有在MRC的环境下使用。 retain引起对象的引用计数加1, release引起引用计数减1,当引用计数为0时,dealloc函数被调用,内存被回收。

strong和weak的区别是?

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


如何理解的atomic的线程安全呢,有没有什么隐患?

atomic对一个数组,进行赋值或获取,是可以保证线程安全的。但是如果进行数组进行操作,比如给数据加对象或移除对象,是不在atomic的保证范围。


assign 和weak的区别有哪些?

assign修饰基础数据类型,int, BOOL

assign修饰对象类型,不改变对象的引用计数。

assign 会产生悬垂指针, assign 的对象被释放之后,对象指针还是会指向原来的地址,会产生悬垂指针 ,导致程序内存泄露和程序崩溃。

weak不改变修饰对象的引用计数

所指向的对象在被释放后自动设置为 nil.

他们的区别:

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

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

但是他们有一个共同点,他们都不会改变修饰对象的引用计数。


copy关键字影响了对象的可变和不可变属性吗?

可变对象(mutable)copy和mutableCopy都是深拷贝 不可变对象(immutable)的copy是浅拷贝,mutableCopy是深拷贝 copy方法返回的都是不可变对象,若被拷贝对象是可变对象,返回的也是不可变对象

浅拷贝和深拷贝的区别?

浅拷贝只是对 内存地址的复制,两个指针指向同一个地址,增加被拷贝对象的引用计数,没有发生新的内存分配。

深拷贝:目标对象指针和源对象指针,指向两片内容相同的内存空间。

2个特点:不会增加被拷贝对象的引用计数,产生了新内存分配,出现了2块内存。

总结区别:

浅拷贝增加引用计数,不产生新的内存。

深拷贝不增加引用结束,会新分配内存

NSMutableArray用copy修饰会出现什么问题?

出现调用可变方法不可控问题,会导致程序崩溃。 具体原因如下:

给Mutable 被声明为copy修饰的属性赋值, 过程描述如下:

1.如果赋值过来的是NSMutableArray对象,会对可变对象进行copy操作,拷贝结果是不可变的,那么copy后就是NSArray

2.如果赋值过来的是NSArray对象, 会对不可变对象进行copy操作,拷贝结果仍是不可变的,那么copy之后仍是NSArray。

所以不论赋值过来的是什么对象,只要对NSMutableArray进行copy操作,返回的对象都是不可变的。

那原来属性声明的是NSMutableArray,可能会调用了add或者remove方法,拷贝后的结果是不可变对象,所以一旦调用这些方法就会程序崩溃(crash)

MRC下如何重写retain修饰变量的setter方法?

先判断再release 再retain


weak属性修饰的变量,如何实现在变量没有强引用后自动置为 nil ?

runtime 维护了一个weak_table_t 弱引用表 ,用于存储指向某一个对象的所有weak指针。weak表其实是一个哈希表,

key是所指对象的地址,value是weak指针的地址的数组。

在对象回收的时候,根据对象的地址将所有weak指针地址的数组,遍历数组把其中的数据置为nil


__weak 和 _Unsafe_Unretain 的区别?

weak 修饰的指针变量,在指向的内存地址销毁后,会在 Runtime 的机制下,自动置为 nil。

_Unsafe_Unretain不会置为 nil,容易出现 悬垂指针,发生崩溃。但是 _Unsafe_Unretain 比 __weak 效率高。

你可能感兴趣的:(iOS属性关键字和相关的面试题)