赞
踩
/*引用计数 retain count*/
//1. 指向: 保存内存地址
//2. 持有: alloc, retain
Person *xuJiYao = [[Person alloc] init];
NSLog(@"xuJiYao:%lu", [xuJiYao retainCount]);
Person *tuTuTu = xuJiYao;
[tuTuTu retain];
NSLog(@"tuTuTu:%lu", [tuTuTu retainCount]);
//3. 释放
[xuJiYao release]; //引用计数减1
xuJiYao = nil; //防止野指针
NSLog(@"%lu", [tuTuTu retainCount]);
[tuTuTu release]; //引用计数减1
//4. 回收:系统自动调用dealloc方法 当一个引用计数为0时, 系统自动调用 可以使用
NSLog(@"%lu", [tuTuTu retainCount]);
//retaincount 和方法实现有关 我们看不到 这个方法不准使用 辅助调试 但不是重要的依据
tuTuTu = nil; //防止野指针
注:
//野指针
//1. 指向访问受限的区域
int *p = 0x00001; //不要指向固定地址 保证初始化
NSLog(@"%d", *p);
//2.指向一个已经被释放的区域
int *q = malloc(sizeof(int));
*q = 5;
free(q);
//q:变成野指针 已经被释放 可以用,但是可以用, 被覆盖了,才会改变值
NSLog(@"%d", *q);
影响引用计数的方法:
+ alloc //开辟内存空间,引用计数由0变为1
- retain //主张对象持有权,引用计数累加1
- release //释放对象,不再持有,引用计数减1
- autorelease //自动释放对象,引用计数未来减1
- copy //拷贝创建一个对象,原有对象引用计数不变
内存管理原则:
英文:
• You own any object you create by allocating memory for it or copying it.Related methods: alloc, allocWithZone:, copy, copyWithZone:, mutableCopy, mutableCopyWithZone:
•If you are not the creator of an object, but want to ensure it stays in memory for you to use, you can express an ownership interest in it. Related method: retain
•If you own an object, either by creating it or expressing an ownership interest, you are responsible for releasing it when you no longer need it.Related methods: release, autorelease
•Conversely, if you are not the creator of an object and have not expressed an ownership interest, you must not release it.
解释: (白话)
/*内存管理原则*/
//1. 谁创建谁持有 创建的时候引用计数为1
//2. 如果这个对象不是你创建的 你也指向这个对象 用retain对他的引用计数加1
//3. 如果你持有一个对象, 你不在使用时, 你就有责任用release 和autorelease给释放
//4. 如果你没有持有, 只是单纯的指向, 你不能去释放它
//对其释放多了, 就会出现野指针 加的次数与减得次数必须持平
归结: 内存空间的引用计数的增加和减少相等.增加: alloc retain copy
减少: release autorelease
引用计数为0后, 系统回收内存空间. 不可以在使用这块内存.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。