iOS中的記憶體管理1

來源:互聯網
上載者:User

標籤:

#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) {//    @autoreleasepool {//        //        Person *p = [[Person alloc] initWithName:@"池" gender:@"nan" age:18];//        NSLog(@"%lu",[p retainCount]);//        //        //        NSLog(@"--------------");//        Person *p1 = [p retain];//        NSLog(@"%lu",[p retainCount]);//        NSLog(@"%lu",[p1 retainCount]);//        //        NSLog(@"--------------");//        //        Person *p2 = [p1 retain];//        NSLog(@"%lu",[p retainCount]);//        NSLog(@"%lu",[p1 retainCount]);//        NSLog(@"%lu",[p2 retainCount]);//        //        NSLog(@"--------------");//        //release 讓對象的引用計數立即 -1//        [p release];//        NSLog(@"%lu", [p retainCount]);//        [p release];//        NSLog(@"%lu", [p retainCount]);//        [p release];//        NSLog(@"%lu", [p retainCount]);// 錯誤的//        //誰才有引用計數的概念://        //1.堆區空間才有引用計數的概念//        //2.堆區的對象才會有引用計數//    //    }//    Person *p = [[Person alloc] initWithName:@"張三" gender:@"男" age:18];//    NSLog(@"%lu", [p retainCount]);//    [p retain];//    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];//    //    //    //    [p autorelease];//    //    NSLog(@"%lu",[p retainCount]);//    //    //    //    [pool release];//     NSLog(@"%lu",[p retainCount]);//                //企業級題//    @autoreleasepool {//        for (long i = 0; i < 100000000; i++) {//            @autoreleasepool {//                Person *per = [[Person alloc] init];//                [per autorelease];//            }//        }//    }        //記憶體管理原則:當你對一個對象進行了 alloc, retain, copy 操作,你就對該對象擁有了所有權,要對該對象負責,對其進行release,或者autorelease操作    //在一個方法內部,要保證對象的+ 和 - 相等.            //建立Person對象    @autoreleasepool {        Person *p = [Person personWithName:@"張三" gender:@"男" age:44];        Person *p1 = [p copy];                [p1 sayHi];        [p1 release];    }           //記憶體問題:    //1.野指標錯誤:最後一個release玩,空間已經被系統回收,如果再訪問,就是訪問一塊沒有所有權的空間,出現野指標,野指標不會立即報錯,但是存在安全隱患,另外,錯誤不容易排錯.    //2.過度釋放:對一塊沒有所有權的空間進行釋放空間,會造成程式的立即crash;    //3.記憶體泄露:對一塊擁有所有權的空間,使用完之後沒有釋放,此時存在安全隱患,當記憶體泄露足夠多得時候,造成程式的crash;    return 0;}

person.h

#import <Foundation/Foundation.h>@interface Person : NSObject<NSCopying>@property (nonatomic,retain) NSString *name;@property (nonatomic,retain) NSString *gender;@property (nonatomic,assign) NSInteger age;- (instancetype)initWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age;+ (instancetype)personWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age;- (void)sayHi;@end

person.m

#import "Person.h"@implementation Person- (instancetype)initWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age{    if (self = [super init]) {        self.name = name;        self.gender = gender;        self.age = age;    }    return self;}+ (instancetype)personWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age{    return [[[self alloc] initWithName:name gender:gender age:age] autorelease];    }- (void)sayHi{    NSLog(@"sayHigoggo");}//當對一個兌現copy時,會自動調用該方法,用來建立新的對象,複製內容- (id)copyWithZone:(NSZone *)zone{    //1.建立新的對象    Person *newPer = [[Person allocWithZone:zone] init];    //2.拷貝內容    newPer.name = self.name;    newPer.age = self.age;    newPer.gender = self.gender;    //3.返回新的對象    return newPer;}//當對象的引用計數為0是系統會自動調用,切記不要人為調用- (void)dealloc{    NSLog(@"%@回收了",self);    [super dealloc];}@end

 

iOS中的記憶體管理1

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.