属性关键字 读写权限 原子性 引用计数 总结

  • 读写权限
  • 原子性
  • 引用计数

读写权限

  • readonly
  • readwrite

默认为readwrite

原子性

  • atomic
  • nonatomic

默认是atomic:修饰的属性可以保证属性赋值和获取是线程安全的。这里的赋值和获取是对成员属性直接的获取和赋值。而对属性的操作是不保证安全的。比如一个数组使用atomic修饰,只保证数组的获取和赋值线程安全,但是对数组进行操作不是线程安全的

引用计数

  • retain/strong
  • assign/unsafe_unretained
  • weak
  • copy

assign和weak的区别?

assign修饰符特点:

  1. 修饰基本数据类型。如int,Bool等
  2. 修饰对象类型的时候,不改变其引用计数
  3. 会产生悬垂指针,即:assign所修饰的对象,在被释放之后,assign指针仍然指向原对象内存地址,如果此时再访问这个对象,会产生异常产生

weak修饰符特点:

  1. 不改变被修饰对象的引用计数
  2. 所指向的对象在被释放之后会自动设置为nil

区别:

  1. weak只修饰对象,assign即可以修饰对象,也可以修饰对象
  2. 对象释放后,weak指向nil, assign扔指向原对象地址。

为什么weak修饰的对象释放后指向nil?->内存管理章节。

copy关键字

  • 浅拷贝:A指针指向内存地址0x01,浅拷贝之后B仍然指向内存地址0x01.
    1. 浅拷贝是对内存地址的拷贝,让目标对象指针和源对象指向同一片内存空间
    2. 浅拷贝增加被拷贝对象的引用计数
    3. 浅拷贝不会发生新的内存分配

      4-5-1

  • 深拷贝:A指针指向内存地址0x01,浅拷贝之后B仍然指向内存地址0x02.
    1. 浅拷贝让目标对象指针和源对象指向两片内容相同的内存空间
    2. 不好改变引用计数
    3. 会发生新的内存分配

      4-5-2

浅拷贝和深拷贝的区分?

  • 是否开辟了新的内存空间
  • 是否影响了引用计数

copy关键字使用

4-5-2

  • 可变对象的copy和mutableCopy都是深拷贝。
  • 不可变对象的copy是浅拷贝,mutableCopy是深拷贝
  • copy返回的对象都是不可变对象

@property (copy) NSMutableArray *array;有什么问题?

如果赋值过来的一个NSMUtableArray, copy之后是NSArray.

如果赋值是NSArray,copy之后是NSArray.

但是声明的是一个NSMutableArray,有可能调用的时候使用NSMutableArray的方法,会造成crash.

总结

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

1
2
3
4
5
6
7
8
9
@property (nonatomic, retain) id obj;

- (void)setObj:(id)obj
{
if (_obj != obj) {
[_obj release];
_obj = [obj retain];
}
}

为什么要进行!=判断?因为如果传递进来的是原来的对象,这里我们有进行release,如果这个对象被释放了,会造成异常产生。

请简述分类的实现原理?

  • 分类是由运行时来决议的
  • 不同分类中含有同名方法,谁最终生效取决于谁最后进行编译。最后参与编译的同名分类方法生效
  • 分类中的方法和宿主类方法同名,会覆盖宿主类的方法。这里的覆盖只是由于消息查找的过程中,查找到靠前的消息导致的,实际宿主的方法还是存在的。

KVO的实现原理?

  • KVO是系统实现的一种观察者模式。
  • 运用了isa混写的技术,来动态运行时,去某一个类添加一个子类,重写她的setter方法,并把原有类的isa指针指向这个新创建的类。

能否为分类添加成员变量?

可以通过关联对象为分类添加成员变量。