- 读写权限
- 原子性
- 引用计数
读写权限
- readonly
- readwrite
默认为readwrite
原子性
- atomic
- nonatomic
默认是atomic:修饰的属性可以保证属性赋值和获取是线程安全的。这里的赋值和获取是对成员属性直接的获取和赋值。而对属性的操作是不保证安全的。比如一个数组使用atomic修饰,只保证数组的获取和赋值线程安全,但是对数组进行操作不是线程安全的
引用计数
- retain/strong
- assign/unsafe_unretained
- weak
- copy
assign和weak的区别?
assign修饰符特点:
- 修饰基本数据类型。如int,Bool等
- 修饰对象类型的时候,不改变其引用计数
- 会产生悬垂指针,即:assign所修饰的对象,在被释放之后,assign指针仍然指向原对象内存地址,如果此时再访问这个对象,会产生异常产生
weak修饰符特点:
- 不改变被修饰对象的引用计数
- 所指向的对象在被释放之后会自动设置为nil
区别:
- weak只修饰对象,assign即可以修饰对象,也可以修饰对象
- 对象释放后,weak指向nil, assign扔指向原对象地址。
为什么weak修饰的对象释放后指向nil?
->内存管理章节。
copy关键字
- 浅拷贝:A指针指向内存地址0x01,浅拷贝之后B仍然指向内存地址0x01.
- 浅拷贝是对内存地址的拷贝,让目标对象指针和源对象指向
同一片内存空间
- 浅拷贝增加被拷贝对象的引用计数
- 浅拷贝不会发生新的内存分配
- 浅拷贝是对内存地址的拷贝,让目标对象指针和源对象指向
- 深拷贝:A指针指向内存地址0x01,浅拷贝之后B仍然指向内存地址0x02.
- 浅拷贝让目标对象指针和源对象指向
两片内容相同的内存空间
- 不好改变引用计数
- 会发生新的内存分配
- 浅拷贝让目标对象指针和源对象指向
浅拷贝和深拷贝的区分?
- 是否开辟了新的内存空间
- 是否影响了引用计数
copy关键字使用
- 可变对象的copy和mutableCopy都是深拷贝。
- 不可变对象的copy是浅拷贝,mutableCopy是深拷贝
- copy返回的对象都是不可变对象
@property (copy) NSMutableArray *array;有什么问题?
如果赋值过来的一个NSMUtableArray, copy之后是NSArray.
如果赋值是NSArray,copy之后是NSArray.
但是声明的是一个NSMutableArray,有可能调用的时候使用NSMutableArray的方法,会造成crash.
总结
MRC下如何重写retain修饰变量的setter方法?
1 |
@property (nonatomic, retain) id obj; |
为什么要进行!=判断?因为如果传递进来的是原来的对象,这里我们有进行release,如果这个对象被释放了,会造成异常产生。
请简述分类的实现原理?
- 分类是由运行时来决议的
- 不同分类中含有同名方法,谁最终生效取决于谁最后进行编译。最后参与编译的同名分类方法生效
- 分类中的方法和宿主类方法同名,会覆盖宿主类的方法。这里的覆盖只是由于消息查找的过程中,查找到靠前的消息导致的,实际宿主的方法还是存在的。
KVO的实现原理?
- KVO是系统实现的一种观察者模式。
- 运用了isa混写的技术,来动态运行时,去某一个类添加一个子类,重写她的setter方法,并把原有类的isa指针指向这个新创建的类。
能否为分类添加成员变量?
可以通过关联对象为分类添加成员变量。
近期评论