------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、知识点介绍
1、在OC中每一个对象都有一个引用计数器,表示对象被引用的次数。当时0时就可以被回收了。
调用retain:计数器+1。
release:计数器-1.。
retainCount:返回计数器的值。
dealloc:释放对象。如:[super dealloc];
2、当对象是通过alloc,new,copy创建的,就需要回收。
野指针:指针变量里面仍然有值,但是指向的对象被销毁了。
僵尸对象:指针指向的对象不存在了。
当向一个野指针发送消息时会报错,EXEC_BAD_ACCESS.
3、代码示例:
--定义CAR类
@interface Car : NSObject
@end // Car
@implementation Car
- (void) dealloc
{
NSLog(@"Car Object is 被回收了。");
}
@end // Car
--定义BOOK类
@interface Book : NSObject
@end // Book
@implementation Book
- (void) dealloc
{
NSLog(@"Book Object is 被回收了。");
}
@end // Book
// 人有 车,书,对象。
@interface Person : NSObject
{
Car *_car;
Book *_book;
}
- (void)setCar:(Car*)car;
- (Car*)car;
- (void) setBook:(Book*)book;
- (Book*)book;
@end // Person
@implementation Person
- (void)setCar:(Car*)car // 严谨的写法
{
if(_car != car)
{
[_car release]; // 如果 _car 是 nil null 0 也不会报错,OC中空指针release不报错。
_car = [car retain]; // 要使用car对象 需要把对象的计数器 +1,
}
}
- (Car*)car
{
return _car;
}
- (void) setBook:(Book*)book
{
if(_car != car) // 如果赋值的对象不等于现有的对象就执行下面的代码。
{
[_book release];
-book = [book retain];
}
}
- (Book*)book
{
_book = book;
}
- (void) dealloc
{
[_car release]; // 当前对象被销毁了,那么其内部使用的其他对象都需要计数器-1,至于是不是回收就要看计数器是不是0了。
[super dealloc];
}
@end // Person
--主函数
int main()
{
Person *p = [[Person alloc] init]; // 需要有对应的release方法。
Car *car = [[Car alloc] init];
Car *car2 = [[Car alloc] init];
Book *b = [[Book alloc] init];
p.car = car;
p.car = car2; // 如果 person类里面的setCar 方法里面不写 [_car release] 就会发生内存泄漏。就是对象不被使用了,但是仍然占用内存。
p.book = b;
[car release];
[car2 release];
[b release];
[p release];
return 0;
}