继续学习内存管理相关知识。
1、小小知识点
1>有关OC内存管理的方法并不包括在该语言中,而是包含在cocoa框架中,用于OS X,iOS的开发。
2>cocoa框架中foundation框架类库中的NSObject类负责内存管理的职责。
3>NSObject类的相关方法:
- (instancetype)alloc ------创建
- (instancetype)retain ------引用计数增加
- (oneway void)release ------引用计数减少
-
(void)dealloc
用图形表示如下:
image.png
4>使用以下方法自己生成的对象,自己持有
+alloc
+new
+copy
+mutableCopy
例如:
NSObject * obj =[ [NSObject alloc]init];
使用alloc方法生成对象,并把指向该对象的指针赋值给了obj这个变量,现在这个对象的retainCount值等于1。
另外,使用new方法生成对象基本等同于[ [NSObject alloc]init]。
即:[NSObject new] --------- [[NSObject alloc]init];
题外话:[NSObject new]和 [[NSObject alloc]init]到底有什么区别呢?
我一直不相信他们没有任何区别,如果真是没有任何区别又为什么要写两个方法呢?
new方法的源码:
+new
{
id newObject = (*_alloc)((Class)self, 0);
Class metaClass = self->isa;
if (class_getVersion(metaClass) > 1)
return [newObject init];
else
return newObject;
}
而 alloc/init 像这样
+alloc
{
return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());
}
-init
{
return self;
}
概括来说,new和alloc/init在功能上几乎是一致的,分配内存并完成初始化。
差别在于,采用new的方式只能采用默认的init方法完成初始化,采用alloc的方式可以用其他定制的初始化方法。
5>非自己生成的对象,自己也能持有
id obj = [NSArray array];
obj可以取得对象的存在,但是并不持有该对象。
如果想持有该对象,需要主动调用retain方法,即:
[obj retain];
这样obj就持有了该对象。
6>自己持有的对象,如果不在需要了,就需要释放该对象,释放对象使用release方法。
//生成并持有该对象
id obj = [[NSObject alloc]init];
//释放该对象
[obj release];
//非自己生成对象
id obj = [NSArray array];
//持有对象
[obj retain];
//释放对象
[obj release];
注意:已经释放的对象是不可以再次访问的,如果访问了已经被释放的对象,就会造成崩溃。(wow,好可怕,但是一定遇见过)。