黑马程序员-----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
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
相关文章推荐
- 黑马程序员----第六篇 OC内存管理(一)
- 黑马程序员——OC内存管理(非ARC,手工管理)
- 黑马程序员----第七篇 OC内存管理(二)
- 黑马程序员-OC内存管理
- 黑马程序员_OC内存管理的总结
- 黑马程序员—OC内存管理
- 黑马程序员_OC内存管理
- 黑马程序员------ios培训 oc内存管理(二)
- 黑马程序员——零基础学习iOS开发——11 OC内存管理
- 黑马程序员——OC内存管理
- 黑马程序员——IOS基础(OC内存管理)
- 黑马程序员——IOS基础——OC内存管理
- 黑马程序员-oc内存管理(Q)
- 黑马程序员—IOS加强视频—oc内存管理
- 黑马程序员——OC内存管理
- 黑马程序员-OC内存管理
- ios黑马程序员--oc内存管理
- 黑马程序员——OC内存管理
- 18、黑马程序员-OC内存管理
- 黑马程序员-----OC内存管理(一)