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

来源:互联网 发布:杭州淘宝美工培训费用 编辑:程序博客网 时间:2024/05/17 09:47
---------------------- 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
0 0
原创粉丝点击