iOS 面试

#4- strong copy assign weak __

2018-08-02  本文已影响0人  iRemark
1.assign 与weak区别

assign 常用来修饰 基本数据类型,weak常用来修饰对象对象,且是一个弱引用。

weak使用场景:

在ARC下,在有可能出现循环引用的时候,往往要通过让其中一端使用weak来解决,比如: delegate代理属性,通常就会声明为weak。

自身已经对它进行一次强引用,没有必要再强引用一次时也会使用weak。比如:自定义 IBOutlet控件属性一般也使用weak,当然也可以使用strong。

2.strong 与copy的区别

strong 与copy都会使引用计数加1,但strong是两个指针指向同一个内存地址,copy会在内存里拷贝一份对象,两个指针指向不同的内存地址

3.__block与__weak的区别

__block:用来修饰一个变量,这个变量就可以在block中被修改 使用 __block修饰的变量在block代码块中会被retain(ARC下会retain,MRC下不会retain)

__weak:使用__weak修饰的变量不会在block代码块中被retain
同时,在ARC下,要避免block出现循环引用 __weak typedof(self)weakSelf = self;

4. block变量定义时为什么用copy?block是放在哪里的?

block本身是像对象一样可以retain,和release。但是,block在创建的时候,它的内存是分配在栈(stack)上,可能被随时回收,而不是在堆(heap)上。他本身的作于域是属于创建时候的作用域,一旦在创建时候的作用域外面调用block将导致程序崩溃。通过copy可以把block拷贝(copy)到堆,保证block的声明域外使用。

block 为什么不用strong?

5. atomic 和 nonatomic 有什么区别

atomic 和 nonatomic 的区别在于,系统自动生成的 getter/setter 方法不一样。如果你自己写 getter/setter,那 atomic/nonatomic/retain/assign/copy 这些关键字只起提示作用,写不写都一样。参考

不过atomic可并不能保证线程安全。这个属性只能说是 setter 和getter 读/写安全的,但并不是线程安全的。参考

https://www.jianshu.com/p/3e0f12e5faaa

上一篇 下一篇

猜你喜欢

热点阅读