黑马程序员技术交流社区
标题: 内存管理及案例 [打印本页]
作者: 谁想去飞 时间: 2014-12-11 23:03
标题: 内存管理及案例
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;
}
作者: zwcshy 时间: 2014-12-12 10:29
昨天刚看完这个视频,总结的挺好
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |