一、引用计数(retainCount) 1、内存的申请 alloc和new是Objective-C语言中申请内存的两种常用方式。 当我们向一个类对象发送一个alloc消息的时候,其会向操作系统在堆中申请一块内存用于存放该类的实例对象。然后将该实例对象的引用计数(retainCount)设置为1,最后返回该对象的指针。 alloc和new的区别:一句话,[Person new]即[[Person alloc]new] 2、引用计数(retainCount) Cocoa框架中,所有继承自NSObject的子类(包括NSObject)对象中都有一个4个字节的存储空间用于存储其retainCount的值。 我们可以通向对象发送retainCount消息来获取该对象的retainCount的值。 3、retain和release 当我们向一个实例对象发送一个retain消息的时候,其引用计数(retainCount)会执行+1操作。 当我们向一个实例对象发送给一个release消息的时候,其引用计数(retainCount)会执行-1操作。 4、内存的释放 在OC中,当我们向一个对象发送release消息是,其先使得该对象的retainCount属性-1,然后在判断该对象的retainCount是否为0。如果为0则在release方法中释放该对象的内存。 对NSObject对象的retain和release实现的猜想 @implementation NSObject { Class isa OBJC_ISA_AVAILABILITY; int retainCount; } -(instancetype)retain { self->retainCount++; return self; } -(void)release { self->retainCount--; if (self->retainCount==0) { [self dealloc]; free(self); } } @end Tip:如果在一个局部作用域中申请了一块内存,但是当该作用域结束时,系统不会自动调用该对象的release方法。 示例: int main(int argc, const char * argv[]) { Person* kaka; if (YES) { kaka = [Person alloc]; NSLog(@"kaka retainCount = %ld",[kaka retainCount]); NSLog(@"end"); } NSLog(@"kaka retainCount = %ld",[kaka retainCount]); return 0; } 代码执行结果: 2015-11-23 13:31:13.447 Test[4576:53048] 调用了allc 2015-11-23 13:31:13.448 Test[4576:53048] kaka retainCount = 1 2015-11-23 13:31:13.448 Test[4576:53048] end 2015-11-23 13:31:13.449 Test[4576:53048] kaka retainCount = 1 Program ended with exit code: 0 可以看出,该系统并不会自动向该对象发送release消息。
|