1.方法的基本使用
1> retain :计数器+1,会返回对象本身
2> release : 计数器 -1,没有返回值
3> retainCount : 获取当前的计数器
4> dealloc :
当前一个对象要被回收的时候,就会调用;
一定要调用[super dealloc],这句调用要放在最后面;
2.一些概念
1> 僵尸对象 : 所占用内存已经被回收的对象,僵尸对象不能再使用
2> 野指针 : 指向僵尸对象(不可用内存)的指针,给野指针发送消息报错(EXC_BAD_ACCESS)
3> 空指针 : 没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错
例:单个对象的内存管理,假设已经定义了Person类 - int main()
{
//通过初始化后 计数器为1
Person *p = [[Person alloc] init];
//retain 方法返回的是对象本身
//计数器为2
[p retain];
//计数器-1变为1
[p release];
//计数器-1变为0
[p release];
return 0;
}
例: 多个对象的内存管理首先定义两个类
(1)Book - @interface Book : NSSObject
{
int _price;
}
- (void)setPrice:(int)price;
- (int)price;
@end
@implementation Book
{
- (void)setPrice:(int)price
{
_price = price;
}
- (int)price
{
return _price;
}
- (void)dealloc
{
NSLog(@"Book对象被回收");
[super dealloc];
}
}
(2) Person - @interface Person : NSObject
{
Book *_book;
}
- (void)setBook:(Book *)book;
- (Book *)book;
@end
@implementation Person
{
- (void)setBook:(Book *)book
{
_book = [book retain];
}
- (Book *)book
{
return _book;
}
- (void)dealloc
{
//当Person对象被回收时,要保证该对象包含的书也被回收
[_book release];
NSLog(@"Person对象被回收");
[super dealloc];
}
}
(3)测试调用代码 int main() { //b 的计数器为1 Book *b = [[Book alloc] init]; //p1 的计数器为1 Person *p1 = [[Person alloc] init]; //p1 想占用b这本身 //b 的计数器为2 [p1 setBook:b];
//b 的计数器为1,Book对象的内存空间没有被释放 [b release]; b = nil; //p1 的计数器为0,b 的计数器为 0 //Person对像的内存空间释放,Book的内存空间也会释放 [p1 release]; p1 = nil;
return 0; }
|