黑马程序员--IOS_学习笔记_内存管理

来源:互联网 发布:最大子数组和 动态规划 编辑:程序博客网 时间:2024/06/07 06:30

------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;

}

0 0
原创粉丝点击