一、引用计数(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消息。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |