标签:
每个OC对象都有自己的引用计数器,是一个整数表示对象被引用的次数,即现在有多少东西在使用这个对象。对象刚被创建时,默认计数器值为1,当计数器的值变为0时,则对象销毁。
在每个OC对象内部,都专门有4个字节的存储空间来存储引用计数器。
作用:
判断对象要不要回收的唯一依据就是计数器是否为0,若不为0则存在。
操作:
给对象发送消息,进行相应的计数器操作。
对象的销毁:
当一个对象的引用计数器为0时,那么它将被销毁,其占用的内存被系统回收。
当对象被销毁时,系统会自动向对象发送一条dealloc消息,一般会重写dealloc方法,在这里释放相关的资源,dealloc就像是对象的“临终遗言”。一旦重写了dealloc方法就必须调用[super dealloc],并且放在代码块的最后调用(不能直接调用dealloc方法)。
Person.m:
#import <Person.h> @implementation Person - (void) dealloc{ NSLog(@"Person dealloc..."); [super dealloc]; } @end
main.m
#import <Person.h> int main(){ // 当我们调用alloc之后,p的引用计数器+1 Person *p = [[Person alloc] init]; // 手动调用release方法来对计数器-1,当检测到计数器为0时,就会调用dealloc方法销毁对象 [p release]; return 0; }
野指针:
指针指向一个已经被回收的地址。
如上例中,在指向完[p release]之后,p就作为一个野指针存在。
空指针:
没有指向任何东西的指针(存储的东西是0,null,nil),给空指针发送消息不会报错。
如上例中,我们将[p release]改成 p = nil, p即为空指针。
1、准则:
2、谁创建,谁release
如果你通过alloc,new,copy来创建了一个对象,那么你就必须调用release或者autorelease方法。
3、谁retain,谁release
只要你调用了retain,无论这个对象时如何生成的,你都要调用release
4、总结
有始有终,有加就应该有减。曾经让某个对象计数器加1,就应该让其在最后-1。
1、只要调用了alloc,就必须有release(autorelease)
2、Set方法的代码规范
(1) 基本数据类型
- (void) setAge: (int) age{ _age = age; }
(2) OC对象类型
- (void) setCar: (Car *) car{ // 判断新设置的对象是否是成员变量里保存的对象 if(car != _car){ // 对旧对象进行release [_car release]; // 对新对象进行retain并赋值给成员变量(retain方法返回对象本身) _car = [car retain]; } }
3、dealloc方法
Autorelease
Person *p = [[[Person alloc] init] autorelease];
基本:
好处:
注意:
Person *p = [[[[Person alloc] init] autorelease] autorelease];
Person *p = [[[Person alloc] init] autorelease];
[p release];
自动释放池:
自动释放池的创建方式:
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init]; // ...逻辑代码 [pool release]; // 在mac中,使用[pool drain]
@autoreleasepool{ // ...逻辑代码 }
ARC是Automatic Reference Counting---自动引用计数。
有自动引用计数,那么就得有手动引用计数MRC(Mannul Reference Counting),前面已经提到的就是MRC。
指针类型:
指针分为强指针和弱指针
// 强指针 Person *p = [[[Person alloc] init] autorelease]; // 强指针 __strong Person *p = [[[Person alloc] init] autorelease]; // 弱指针 __weak Person *p = [[[Person alloc] init] autorelease];
也就是说,通过__strong和__week来区分强指针和弱指针,默认情况下,所有指针都是强指针,前面有个__strong
特点:
标签:
原文地址:http://www.cnblogs.com/imabel/p/4441578.html