內存管理

 

 

#import <Foundation/Foundation.h>數組

//.txtapp

//.dataatom

//.bssspa

//.heaporm

//.stack對象

//引用計數內存

//count = 10字符串

//count --;string

//count = 0it

 

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        char *pstr = malloc(1000);

        char *pstr1 = pstr;

        char *pstr2 = pstr;

        

        scanf("%s", pstr);

        printf("%s\n", pstr);

        free(pstr);

        pstr = NULL;

    }

    return 0;

}

 

 

 ————————————————————————————————————分割————————————————————————————

#import <Foundation/Foundation.h>

 

@interface Dog : NSObject

 

@end

 

 

#import "Dog.h"

 

@implementation Dog

 

- (void)dealloc

{

    NSLog(@"對象被釋放");

    [super dealloc];

}

 

@end

 

 

 

 

#import <Foundation/Foundation.h>

#import "Dog.h"

//ARC  automatic reference counting //自動引用計數

//MRC  manaul reference counting  //手動引用計數

 

//對於引用計數來講,有一套內存管理的黃金法則:

//The basic rule to apply is everything that increases the reference counter with alloc, [mutable]copy[withZone:] or retain is in charge of the corresponding [auto]release.

//若是對一個對象使用了alloc、[mutable]copy、retain,那麼你必須使用相應的release或者autorelease。

//通俗一點的說法就是誰污染誰治理,誰殺的誰埋。

 

 

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        Dog *xiaoHei = [[Dog alloc] init];

        //[xiaoHei release];//release 計數器-1 自動調用dealloc

    }

    NSLog(@"程序退出");

    return 0;

}

 

 

 

 ————————————————————————————————————分割————————————————————————————

#import <Foundation/Foundation.h>

 

@interface Dog : NSObject

 

@end

 

#import "Dog.h"

 

@implementation Dog

 

@end

 

 

 

//對於引用計數來講,有一套內存管理的黃金法則:

//The basic rule to apply is everything that increases the reference counter with alloc, [mutable]copy[withZone:] or retain is in charge of the corresponding [auto]release.

//若是對一個對象使用了alloc、[mutable]copy、retain,那麼你必須使用相應的release或者autorelease。

//通俗一點的說法就是誰污染誰治理,誰殺的誰埋。

 

//建立一個對象, 對應的引用計數 retainCount

 

#import <Foundation/Foundation.h>

#import "Dog.h"

 

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        Dog *xiaoHei = [[Dog alloc] init];

        NSLog(@"xiaoHei = %ld", xiaoHei.retainCount);//獲取引用計數值

        //retain : 引用計數進項保留(增長對對象的擁有權), 引用計數加1

        Dog *xiaoBai = [xiaoHei retain];

        NSLog(@"xiaoBai = %ld", xiaoBai.retainCount);

        

        Dog *xiaoHua = [xiaoHei retain];

        NSLog(@"xiaoHua = %ld", xiaoHua.retainCount);

        

        [xiaoHei release];//使引用計數減1

        xiaoHei = nil;

        

        NSLog(@"retainCount = %ld", xiaoBai.retainCount);

        [xiaoBai release];

        NSLog(@"retainCount = %ld", xiaoHua.retainCount);

        [xiaoHua release];//dealloc

        

        xiaoHua = nil;

        

        NSLog(@"今每天氣不錯, 是出遊的日子");

        NSLog(@"今每天氣不錯, 是出遊的日子");

        NSLog(@"今每天氣不錯, 是出遊的日子");

        NSLog(@"今每天氣不錯, 是出遊的日子");

        NSLog(@"今每天氣不錯, 是出遊的日子");

        NSLog(@"今每天氣不錯, 是出遊的日子");

        NSLog(@"今每天氣不錯, 是出遊的日子");

        NSLog(@"今每天氣不錯, 是出遊的日子");

        NSLog(@"今每天氣不錯, 是出遊的日子");

        sleep(1);

        

 

        //NSLog(@"retainCount = %ld", xiaoHua.retainCount);//當一個對象被釋放後, 不該該再給它發送消息

    }

    return 0;

}

 

 

 

 

 ————————————————————————————————————分割————————————————————————————

#import <Foundation/Foundation.h>

#import "Dog.h"

 

@interface Person : NSObject

{

    Dog *_dog;

}

 

- (void)setDog:(Dog *)newDog;

 

- (Dog *)dog;

 

- (void)dealloc;

 

@end

 

 

#import "Person.h"

 

@implementation Person

 

//寫法一 不OK

//- (void)setDog:(Dog *)dog

//{

//    _dog = dog;

//}

//寫法二

//- (void)setDog:(Dog *)dog

//{

//    _dog = [dog retain];

//}

 

//寫法三

//- (void)setDog:(Dog *)dog

//{

//    [_dog release];

//    _dog = [dog retain];

//}

 

//標準寫法

 

- (void)setDog:(Dog *)dog

{

    if (_dog!=dog) {

        [_dog release];

        _dog =[dog retain];

    }

}

 

- (Dog *)dog

{

    return _dog;

}

 

- (void)dealloc

{

    NSLog(@"dog dealloc");

    [super dealloc];

}

@end

 

 

 

 

#import <Foundation/Foundation.h>

 

@interface Dog : NSObject

 

@end

 

 

 

#import "Dog.h"

 

@implementation Dog

 

@end

 

 

#import <Foundation/Foundation.h>

#import "Dog.h"

#import "Person.h"

 

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        //寫法一

        //xiaohei 被釋放, 那麼per.dog被釋放

//        Dog *xiaoHei = [[Dog alloc] init];

//        Person *per = [[Person alloc] init];

//        per.dog = xiaoHei;

//        

//        [xiaoHei release];

//        

//        [per release];

        //寫法二, 若是人再持有別的狗,就會形成第一條狗得不到釋放,內存泄露

//        Dog *xiaoHei = [[Dog alloc] init];

//        Dog *xiaoBai = [[Dog alloc] init];

//        

//        Person *per = [[Person alloc] init];

//        per.dog = xiaoHei ;

//        NSLog(@"count = %ld", xiaoHei.retainCount);

//        [xiaoHei release];//count =1;

//        per.dog = xiaoBai;

//        

//        [xiaoBai release];

//        [per release];

        

        //寫法三

        //若是原本持有一條狗,又從新設置這條狗,先進行release,這個時候,極可能dog就銷燬了,而後,就無法再次retain了

//        Dog *xiaoHei = [[Dog alloc] init];

//        Dog *xiaoBai = xiaoHei;

//        Person *per = [[Person alloc] init];

//        per.dog = xiaoHei;

//        per.dog = xiaoBai;

 

    }

    return 0;

}

 

 ————————————————————————————————————分割————————————————————————————

 

#import <Foundation/Foundation.h>

#import "Dog.h"

 

@interface Person : NSObject

{

    NSString *_name;

    int _age;

    Dog *_dog;

}

 

//assign 直接賦值  int float long long long (基本數據類型)

//@property (nonatomic, assign) Dog *dog;

@property (nonatomic, assign)int age;

@property (nonatomic, retain)Dog *dog;

@property (nonatomic, copy)NSString *name;

 

@end

 

 

 

#import "Person.h"

 

@implementation Person

 

//assgin

- (void)setAge:(int)age

{

    _age = age;

}

 

//retain (自定類 類定義的變量)

 

- (void)setDog:(Dog *)dog

{

    if (_dog!=dog) {

        [_dog release];

        _dog =[dog retain];

    }

}

 

//copy NSString NSArray NSDirctionary

 

- (void)setName:(NSString *)name

{

    if (_name != name) {

        [_name release];

        _name = [name copy];

    }

}

 

 

@end

 

 

 

 

#import <Foundation/Foundation.h>

 

@interface Dog : NSObject

 

@end

 

 

 

#import "Dog.h"

 

@implementation Dog

 

@end

 

 

#import <Foundation/Foundation.h>

#import "Dog.h"

#import "Person.h"

 

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        //NSString *str= @"xiaoHei";

        //NSMutableString *str= [NSMutableString stringWithFormat:@"xiaoHei"];

        char *pstr = malloc(100); 

        strcpy(pstr, "xiaoHei");

        NSString *str = [NSString stringWithUTF8String:pstr];

        

        //NSString *str = [NSString stringWithFormat:@"%@",str];

        

        Person *per = [[Person alloc] init];

        per.name = str;

        

        NSLog(@"str = %p", str);

        NSLog(@"name = %p", per.name);

    }

    return 0;

}

 

 

 

 ————————————————————————————————————分割————————————————————————————

#import <Foundation/Foundation.h>

 

//copy

//mutableCopy

 

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        /*

        //copy

        //copy 把可變對象或者不可變對象, 拷貝生成不可變對象

        

        NSString *str = @"helloworld";

        NSMutableString *mulStr = [NSMutableString stringWithString:str];

        

        id obj1 = [str copy];

        

        id obj2 = [mulStr copy];

        

        //NSLog(@"str = %p", str);

        //NSLog(@"obj = %p", obj1);

        

        NSLog(@"mulStr = %p", mulStr);

        NSLog(@"obj2 = %p", obj2);

        

        NSLog(@"obj2 = %@", obj2);

        

        //[obj appendString:@"zhongguo"];

        //[obj2 appendString:@"zhongguo"] ;

        

        

        

        //NSLog(@"%@", obj);

        

        //[obj release];

        [obj2 release];

        */

        //multableCopy

        //把可變對象或者不可變對象, 拷貝生成可變對象

        

        NSString *str = @"qiangfeng";

        NSMutableString *mulStr = [NSMutableString stringWithString:str];

        

        id obj = [str mutableCopy];

        

        id obj2 = [mulStr mutableCopy];

        

        NSLog(@"%@", obj);

        NSLog(@"obj2 = %@", obj2);

        

        [obj appendString:@"helloworld"];

        NSLog(@"%@", obj);

        [obj2 appendString:@"1000phone"];

        NSLog(@"obj2 = %@", obj2);

        

    }

    return 0;

}

 

 ————————————————————————————————————分割————————————————————————————

 

#import <Foundation/Foundation.h>

 

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        //字符串內存管理, retainCount 的值不定, 只管遵照內存管理法則

        

        NSString *str = @"qianfeng";//常量區

        NSLog(@"str = %ld", str.retainCount);

        

        NSString *str1 = [[NSString alloc] initWithString:str];

        

        NSLog(@"%p %p", str, str1);

        

        NSLog(@"str1 = %ld", str1.retainCount);

        

        NSString *str2 = [[NSString alloc] initWithFormat:@"%@,%d", str, 12345];

        //str2 對象存儲在堆中

        NSLog(@"str2 = %ld", str2.retainCount);

        

        NSString *str3 = [str retain];

        NSLog(@"str3 = %ld", str3.retainCount);

        

        NSString *str4 = [str1 retain];

        NSLog(@"str4 = %ld", str4.retainCount);

        

        NSString *str5 = [str2 retain];

        NSLog(@"str5 = %ld", str5.retainCount);

        

        NSMutableString *str6 = [[NSMutableString alloc] initWithString:str];

        NSLog(@"str6 = %ld", str6.retainCount);

        

        NSMutableString *str7 = [str6 retain];

        NSLog(@"str7 = %ld", str7.retainCount);

        

        [str1 release];

        [str2 release];

        [str3 release];

        [str4 release];

        [str5 release];

        [str6 release];

        [str7 release];

        

    }

    return 0;

}

 

 ————————————————————————————————————分割————————————————————————————

#import <Foundation/Foundation.h>

 

@interface Dog : NSObject

 

@end

 

 

 

#import "Dog.h"

 

@implementation Dog

 

@end

 

 

 

#import <Foundation/Foundation.h>

#import "Dog.h"

 

//數組

 

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        Dog *xiaoHei = [[Dog alloc] init];

        Dog *xiaoBai = [[Dog alloc] init];

        Dog *xiaoHua = [[Dog alloc] init];

        Dog *xiaoHuang = [[Dog alloc] init];

        

        NSLog(@"xiaoHei = %ld", xiaoHei.retainCount);

        NSLog(@"xiaoBai = %ld", xiaoBai.retainCount);

        NSLog(@"xiaoHua = %ld", xiaoHua.retainCount);

        NSLog(@"xiaoHuang = %ld", xiaoHuang.retainCount);

        

        NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:xiaoBai,xiaoHei,xiaoHua,xiaoHuang, nil];

        NSLog(@"xiaoHei = %ld", xiaoHei.retainCount);

        NSLog(@"xiaoBai = %ld", xiaoBai.retainCount);

        NSLog(@"xiaoHua = %ld", xiaoHua.retainCount);

        NSLog(@"xiaoHuang = %ld", xiaoHuang.retainCount);

        

        [arr addObject:xiaoBai];

         NSLog(@"xiaoBai = %ld", xiaoBai.retainCount);

        [arr addObject:xiaoBai];

        NSLog(@"xiaoBai = %ld", xiaoBai.retainCount);

        //當往數組中添加對象, 對應的對象的引用計數加1

        

        NSLog(@"len = %ld", [arr count]);

        [xiaoBai release];

        [xiaoHei release];

        [xiaoHua release];

        [xiaoHuang release];

        

        NSLog(@"xiaoHei = %ld", xiaoHei.retainCount);

        NSLog(@"xiaoBai = %ld", xiaoBai.retainCount);

        NSLog(@"xiaoHua = %ld", xiaoHua.retainCount);

        NSLog(@"xiaoHuang = %ld", xiaoHuang.retainCount);

        [arr release];//把數組中的每一個元素,引用計數減1

        

        //NSLog(@"xiaoHei = %ld", xiaoHei.retainCount);

        //NSLog(@"xiaoBai = %ld", xiaoBai.retainCount);

        //NSLog(@"xiaoHua = %ld", xiaoHua.retainCount);

        //NSLog(@"xiaoHuang = %ld", xiaoHuang.retainCount);

        

        

    }

    return 0;

}

 

 ————————————————————————————————————分割————————————————————————————

#import <Foundation/Foundation.h>

 

@interface Dog : NSObject

 

@end

 

 

 

#import "Dog.h"

 

@implementation Dog

 

@end

 

 

#import <Foundation/Foundation.h>

#import "Dog.h"

 

//autorelease autoreleasepool

int main(int argc, const char * argv[]) {

    @autoreleasepool {//自動釋放池

        

        Dog *xiaoHei = [[Dog alloc] init];

        

        //[xiaoHei release];

        [xiaoHei autorelease];//把xiaoHei的擁有權給自動釋放池, 自動池幫咱們釋放對象內存

        //自動釋放池相似數組,自動釋放池把其中的每一個對象都release一次

        NSLog(@"count = %ld", xiaoHei.retainCount);

        

    }

    @autoreleasepool {

 

    }    

    @autoreleasepool {

 

    }

    return 0;

}

 

 ————————————————————————————————————分割————————————————————————————

#import <Foundation/Foundation.h>

 

@interface Dog : NSObject

 

+(Dog *)DogCreat;

 

@end

 

 

 

#import "Dog.h"

 

@implementation Dog

 

//在類方法裏面也要遵照內存管理法則

+ (Dog *)DogCreat

{

    Dog *dog = [[self alloc] init];

    //[dog release]; 不能調用

    [dog autorelease];

    

    return dog;

}

 

@end

 

 

#import <Foundation/Foundation.h>

#import "Dog.h"

 

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        

        Dog *dog = [Dog DogCreat];

        

        

        

    }

    return 0;

}

相關文章
相關標籤/搜索