autorelase:可以將對象交給自動釋放池中,釋放池銷毀的時候對里面的對象做一次release操作代碼如下
@autoreleasepool { Person *person = [[[Person alloc] init] autorelease]; }
上面代碼雖然正確,但是為了簡化代碼在開發中一般是提供一個類方法來專門創建對象,并且將管理內存的代碼封裝到類方法中:
注意:定義方法名的時候以類名開頭,返回類型為instancetype,而且在創建對象的時候使用self關鍵字/******************************** Person.h文件 ********************************************/
#import <Foundation/Foundation.h>@interface Person : NSObject@PRoperty (nonatomic,assign) int age;+ (instancetype)person;+ (instancetype)personWithAge:(int)age;@end/*********************************** Person.m文件 ********************************/#import "Person.h"@implementation Person
// 類方法命名以類名開頭+ (instancetype)person{ Person *person = [[[self alloc] init] autorelease]; // 用self后Person類不僅可以快速創建對象 如果有子類繼承Person也可以創建對象
return person;
}
+ (instancetype)personWithAge:(int)age { Person *person = [self person];
person.age = age;
return person;}
- (void)dealloc{ NSLog(@"%d歲的Person對象被銷毀",_age); [super dealloc];}@end/*********************************** mian.m文件 ********************************/#import <Foundation/Foundation.h>#import "Person.h"
int main(int argc, const char * argv[]){ @autoreleasepool { Person *person = [Person person]; person.age = 30;
Person *Person2 = [Person personWithAge:20]; } return 0;}
上面代碼中是模擬系統寫法:即方法中沒有alloc,new,copy說明返回的對象都是autorelease過的對象,不用release或autorelease
而且系統中的很多方法也是遵照這個原則,比如下面代碼
@autoreleasepool {
int a = 20;
NSString *str = @"abc"; NSString *str2 = [NSString stringWithFormat:@"%d",a]; NSNumber *num = [[NSNumber alloc] initWithInt:a]; [num release];
}
可以看出在創建NSString類對象的時候就不用關心內存問題,系統已經在底層實現了對內存的管理。但是如果系統方法中涉及到了alloc,new,copy還需要去管理內存新聞熱點
疑難解答