Objective-C - autorelease詳解

來源:互聯網
上載者:User

標籤: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詳解

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.