您的位置:首页 > 职场人生

黑马程序员-----OC内存管理(二)

2014-07-26 17:57 211 查看
----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
OC内存管理
1>内存管理原则

①只要还有人在用某个对象,那么这个对象就不会被回收;只要想用这个对象,就让计数器+1;档不想使用这个对象,就让对象的计数器-1。

②如果你通过alloc,new或者[mutable]copy来创建一个对象,那么你就必须调用release或者autorelease,如果不是你创建的,你就不需要去[auto]release。

③只要你掉用了retain,无论这个对象是怎么产生的,你都要调用release。

2>内存管理实例

//Book.h

@interface Book : NSObject

{

 int _price;

}

- (void)setPrice:(int)price;

- (int)price;

@end

//Book.m

@implementation  Book

- (void)setPrice:(int)price

{

 _price = price;

}

- (int)price

{

 return _price;

}

//重写dealloc

- (void)dealloc

{

 NSlog(@"Book被回收");

 [super dealloc];

}

@end

//Person.h

@class Book;

@interface Person : NSObject

{

 Book *_book;

}

- (void)setBook:(Book *)book;

- (Book *)book;

@end

//Person.m

@implementation

- (void)setBook:(Book *)book

{

 //我们的Person为了拥有一个book那么,就需要(让book的计数器+1)retain;

 if(_book != book)

 {

  [_book release];

  _book = [book retain];

 }

}

- (Book *)book

{

 return _book;

}

//重写dealloc方法

- (void)dealloc

{

 //在遗言之前,必须对所有的你拥有的对象release,这里只有_book。

 [_book release];

 [super dealloc];

}

@end

//main.m

int main()

{

 //计数器b为1,p为1

 Book *b = [[Book alloc] init];

 Person *p = [[Person alloc] init];

 

 //计数器b为2,p为1

 //p想占用b这本书,就需要retain,放在setter方法中

 [p setBook:b];

 //计数器b为1,p为1

 [b release];

 b = nil;

 

 //计数器b为0,p为0

 [p release];

 p = nil; 

 return 0;

}

3>setter方法的内存管理

①setter方法实现

- (void)setBook:(Book *)book{

 if (book != _book) {

  [_book release];

  _book = [book retain];

 }

}
②@property的内存管理

//自动生成setter方法管理内存,会先release旧值,retain新值

@property (nonatomic, retain) Book *book;

//重写dealloc方法

方法同上。

4>小零碎

①有加就有减,曾经让对象计数器+1,就必须在最后让计数器-1。

②在dealloc当中必须将对象当中拥有的对象进行release,而且因为OC不存在空指针错误即[nil release]没有错的,那么我们可以在dealloc中对所有的对象成员调用一次release方法。

③setter方法先release旧指,再retain新指。

④在需要进行内存管理的,必须使用@property (retain)(或者手动实现setter方法)和重写dealloc方法。
⑤@property常用参数:retain,assign,copy,readonly,readwrite

⑥BOOL类型的变量getter方法名以is开头eg:isRich

----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息