標籤:objective autorelease 自動釋放池 計數器
autorelease詳解
/* 1.autorelease的基本用法 1> 會將對象放到一個自動釋放池中 2> 當自動釋放池被銷毀時,會對池子裡面的所有對象做一次release操作 3> 會返回對象本身 4> 調用完autorelease方法後,對象的計數器不變 2.autorelease的好處 1> 不用再關心對象釋放的時間 2> 不用再關心什麼時候調用release 3.autorelease的使用注意 1> 佔用記憶體較大的對象不要隨便使用autorelease 2> 佔用記憶體較小的對象使用autorelease,沒有太大影響 4.錯誤寫法 1> alloc之後調用了autorelease,又調用release @autoreleasepool { // 1 Person *p = [[[Person alloc] init] autorelease]; // 0 [p release]; } 2> 連續調用多次autorelease @autoreleasepool { Person *p = [[[[Person alloc] init] autorelease] autorelease]; } 5.自動釋放池 1> 在iOS程式運行過程中,會建立無數個池子。這些池子都是以棧結構存在(先進後出) 2> 當一個對象調用autorelease方法時,會將這個對象放到棧頂的釋放池 6.自動釋放池的建立方式 1> iOS 5.0前 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; [pool release]; // [pool drain]; 2> iOS 5.0 開始 @autoreleasepool { } */#import <Foundation/Foundation.h>#import "Person.h"int main(){ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; Person *pp = [[[Person alloc] init] autorelease]; [pool release]; // [pool drain]; @autoreleasepool { // 1 Person *p = [[[[Person alloc] init] autorelease] autorelease]; // 0 // [p release]; } return 0;}void test(){ @autoreleasepool {// { 開始代表建立了釋放池 // autorelease方法會返回對象本身 // 調用完autorelease方法後,對象的計數器不變 // autorelease會將對象放到一個自動釋放池中 // 當自動釋放池被銷毀時,會對池子裡面的所有對象做一次release操作 Person *p = [[[Person alloc] init] autorelease]; p.age = 10; @autoreleasepool { // 1 Person *p2 = [[[Person alloc] init] autorelease]; p2.age = 10; } Person *p3 = [[[Person alloc] init] autorelease]; } // } 結束代表銷毀釋放池}
@interface Person : NSObject@property (nonatomic, assign) int age;@end
#import "Person.h"@implementation Person- (void)dealloc{ NSLog(@"Person---dealloc"); [super dealloc];}@end
autoreleased的應用
#import "Person.h"#import "GoodPerson.h"/* 1.系統內建的方法裡面沒有包含alloc、new、copy,說明返回的對象都是autorelease的 2.開發中經常會提供一些類方法,快速建立一個已經autorelease過的對象 1> 建立對象時不要直接用類名,一般用self + (id)person { return [[[self alloc] init] autorelease]; } */int main(){ @autoreleasepool { Person *p = [Person personWithAge:100]; GoodPerson *p2 = [GoodPerson personWithAge:10]; p2.money = 100; } return 0;}void test(){ Person *p = [[Person alloc] init]; p.age = 200; [p release]; // 包 // Student com.mj.test // Student com.mj.test2 // MJStudent // SBStudent // Next Step @autoreleasepool { // Person *p2 = [Person person]; // // p2.age = 100; Person *p2 = [Person personWithAge:100]; // Person *p2 = [[[Person alloc] init] autorelease]; // // p2.age = 300; NSString *str = @"123123"; NSString *str2 = [NSString stringWithFormat:@"age is %d", 10]; NSNumber *num = [[NSNumber alloc] initWithInt:10]; [num release]; NSNumber *num2 = [NSNumber numberWithInt:100]; }}
@interface Person : NSObject@property (nonatomic, assign) int age;+ (id)person;+ (id)personWithAge:(int)age;@end
@implementation Person+ (id)person{ return [[[self alloc] init] autorelease];}+ (id)personWithAge:(int)age{ Person *p = [self person]; p.age = age; return p;}- (void)dealloc{ NSLog(@"%d歲的人被銷毀了", _age); [super dealloc];}@end
#import "Person.h"@interface GoodPerson : Person@property (nonatomic, assign) int money;@end
@implementation GoodPerson@end
Objective-C - autorelease詳解