什么是深浅拷贝?
浅拷贝是指针拷贝,深拷贝是对象拷贝。
对一个对象如何实现拷贝
实现NSCopying协议,和NSMutableCopying协议。
- (id)mutableCopyWithZone:(nullable NSZone *)zone;
- (id)copyWithZone:(NSZone *)zone;
复制代码
weak assign copy strong 的区别
-
weak 用来修饰弱引用的属性。表明该属性定义了一种“非拥有关系”。为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同assign类似。然而在属性所指的对象遭到摧毁时,属性值也会清空(nil out)。 而assign的“设置方法”只会执行针对“纯量类型” (scalar type,例如 CGFloat 或 NSlnteger 等)的简单赋值操作。
-
assign 可以用非 OC 对象,而 weak 必须用于 OC 对象
-
使用 copy 的目的是为了让本对象的属性不受外界影响.
-
strong 用来修饰强引用的属性,只复制对象的指针属于浅拷贝
什么是block
- Block 是带有自动变量的匿名函数
- 在编程过程中,Block被看成是对象,这个对象封装了一段代码,这段代码可以在任何时候执行。Block可以作为函数参数,或者函数的返回值,而其本身又可以带入参数或者返回值。
__block 说明符将变量的作用域,扩大到Block表达式内。 Static说明符也可以做到这一点。
block的内存管理
Block本身是像对象一样,可以retain和release。但是block在创建的时候,它的内存是分配在栈(stack)上,而不是分配在堆(heap)上。它本身的作用域是属于创建时候的作用域,一旦在创建的作用域外调用block将导致程序崩溃。
copy会把block从栈上拷贝到堆上,这样就可以在其他地方使用这个block了。使用retain无效,只是引用计数增加,还是存在于栈上。在MRC下直接将block放入集合类中是无法在其他地方使用的,需要对block进行copy。ARC下编译器会自动copy。
block用什么修饰?
在 MRC 中,方法内部的 block 是在栈区的,使用 copy 可以把它放到堆区。在 ARC 中写不写都行:对于 block 使用 copy 还是 strong 效果是一样的。编译器会自动对 block 进行了 copy 操作。