学习MJ的视频课程,整理总结知识点–MRC、copy

MRC

人、狗
狗属于人,人存在狗就要存在,人死了,狗也得死。狗的内存管理交给人

有两个狗,人换狗了,老狗要先释放

set方法:release旧值,retain新值
要判断是不是同一个狗,同一个狗的话就跳过,因为此时release旧值,导致狗的retaincount为0,狗会释放

1
2
3
4
5
6
- (void)setDog:(MJDog *)dog {
if (_dog != dog) {
[_dog release];
_dog = [dog retain];
}
}

升级版使用@property
@property, 编译器自动生成synthesize:自动生成成员变量和属性的setter、getter实现

1
2
3
4
5
6
@property (nonatomic, retain) MJDog *dog;

- (void)dealloc {
self.dog = nil;
[super dealloc];
}

MRC编程
NSMutableArray的alloc方法,需要自己release,不是alloc或new或copy初始化的,比如[NSMutableArray array]初始化的,就不需要调用release,这个类方法内部实现会有类似autorelease函数的调用

工厂方法,里面封装autorelease

copy

拷贝

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
根本
// 拷贝的目的:产生一个副本对象,跟源对象互不影响
// 修改了源对象,不会影响副本对象
// 修改了副本对象,不会影响源对象

/*
iOS提供了2个拷贝方法
1.copy,不可变拷贝,产生不可变副本

2.mutableCopy,可变拷贝,产生可变副本

深拷贝和浅拷贝
1.深拷贝:内容拷贝,产生新的对象
2.浅拷贝:指针拷贝,没有产生新的对象
*/

不可变对象的copy,大家都是不可变,干脆指向同一块内容,所以生成的还是不可变对象

可变对象的copy,都是深拷贝,生成不可变副本

总结

参考和源码

源码:

评论