首页 > 代码库 > iOS autorelease使用详解
iOS autorelease使用详解
1.作用
示例代码:
@autoreleasepool { // 栈底的pool
@autoreleasepool { // 中间的pool
@autoreleasepool { // 栈顶的pool.....还可以嵌套
People *people = [[[People alloc] init] autorelease];
}
GoodPeople *goodpeople = [[[GoodPeople alloc] init] autorelease];
}
BadPeople *badpeople = [[[BadPeople alloc] init] autorelease];
}
[p release]; //这行代码一执行完,p就不存在了,等p所在的pool销毁时,会给p发送release消息,那时会报坏访问错误
6.2 Person *p = [[[[Person alloc] init] autorelease] autorelease]; //这行代码,表示pool销毁时,给对象p发送了2个release消息,发送第2个release消息是一个坏访问错误
7.快速创建对象的类方法,一般和autorelease结合使用,在MRC里
+ (instancetype)book {
return [[[self alloc] init] autorelease];
}
在创建对象的类方法中使用autorelease的好处:
1>节省代码,外面如果想创建一个book,直接调[Book book]就行了,不需要写这么长,[ [ [Book alloc ] init ] autorelease ]
2>返回对象给别人用的时候,别人不需要去管内存. 例如Book *b = [Book book];别人不需要再release了,因为book方法内部已经做了autorelease
3>从内存管理原则的角度,因为book方法,不是alloc,也不是retain,所以不需要release
8. 很多系统自带的方法,返回的也是autorelease对象
NSNumber *n = [NSNumber numberWithInt:100];
NSString *s = [NSString stringWithFormat:@"jack"];
NSString *s2 = @"rose";
8.1 这些系统自带方法是怎样产生autorelease对象的?
1>首先得从构造方法说起,假设有个Book的类,Book有price属性
- (instancetype)initWithPrice:(float)price{
if(self == [super init]){
_price = price;
}
return self;
}
2>普通类方法
+ (instancetype)book{
return [[[self alloc]init]autorelease]
}
3>类方法+构造
+ (instancetype)bookWithPrice:(float)price{
return [[[self alloc]initWithPrice:price] autorelease];
}
iOS autorelease使用详解