OC7_复合类内存管理(setter方法)

//

//  Person.h

//  OC7_复合类内存管理(setter方法)

//

//  Created by zhangxueming on 15/6/18.

//  Copyright (c) 2015年 zhangxueming. All rights reserved.

//



#import <Foundation/Foundation.h>

#import "Dog.h"



@interface Person : NSObject

{

    Dog *_dog;

}



- (Dog *)dog;



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





@end
//

//  Person.m

//  OC7_复合类内存管理(setter方法)

//

//  Created by zhangxueming on 15/6/18.

//  Copyright (c) 2015年 zhangxueming. All rights reserved.

//



#import "Person.h"



@implementation Person



- (Dog *)dog

{

    return _dog;

}



//方法一:

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

//{

//    _dog = dog;

//}



//方法二:



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

//{

//    _dog = [dog retain];

//}



//方法三:



- (void)setDog:(Dog *)dog//xiaoHei _dog count = 1;

{

    [_dog release];//0

//    NSLog(@"lajfalfjal");

//    NSLog(@"jslfjslfjl");

//    NSLog(@"lajfalfjal");

//    NSLog(@"jslfjslfjl");

//    NSLog(@"lajfalfjal");

//    NSLog(@"jslfjslfjl");

//    NSLog(@"lajfalfjal");

//    NSLog(@"jslfjslfjl");

//    NSLog(@"lajfalfjal");

//    NSLog(@"jslfjslfjl");

//    NSLog(@"lajfalfjal");

//    NSLog(@"jslfjslfjl");

//    NSLog(@"lajfalfjal");

//    NSLog(@"jslfjslfjl");

//    NSLog(@"lajfalfjal");

//    NSLog(@"jslfjslfjl");

    _dog = [dog retain];

}



//标准写法

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

//{

//    if (_dog!=dog) {

//        [_dog release];

//        _dog = [dog retain];

//    }

//}



- (void)dealloc

{

    [_dog release];

    [super dealloc];

}



@end
//

//  Dog.h

//  OC7_复合类内存管理(setter方法)

//

//  Created by zhangxueming on 15/6/18.

//  Copyright (c) 2015年 zhangxueming. All rights reserved.

//



#import <Foundation/Foundation.h>



@interface Dog : NSObject



@end
//

//  Dog.m

//  OC7_复合类内存管理(setter方法)

//

//  Created by zhangxueming on 15/6/18.

//  Copyright (c) 2015年 zhangxueming. All rights reserved.

//



#import "Dog.h"



@implementation Dog

//-(void)dealloc

//{

//    //NSLog(@"12321313");

//    [super dealloc];

//}

@end
//

//  main.m

//  OC7_复合类内存管理(setter方法)

//

//  Created by zhangxueming on 15/6/18.

//  Copyright (c) 2015年 zhangxueming. All rights reserved.

//



#import <Foundation/Foundation.h>

#import "Dog.h"

#import "Person.h"



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

    @autoreleasepool {

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

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

        //方法一: 不ok,人并没有真正持有狗,如果在main函数里[xiaoBai release],让dog的引用计数减1,就变为0,dog就销毁了

//        xiaoXin.dog = xiaoBai;

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

//         [xiaoBai release];//

       // [xiaoXin release];

        //方法二:

        //不ok,如果人再持有别的狗,就会造成第一条狗得不到释放,内存泄露。

//        xiaoXin.dog = xiaoBai;

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

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

//        xiaoXin.dog = xiaoHei;

//        [xiaoBai release];

//        [xiaoHei release];

//        [xiaoXin release];

        //方法三:不ok,如果本来持有一条狗,又重新设置这条狗,先进行release,这个时候,很可能dog就销毁了,然后,就没法再次retain了。

        xiaoXin.dog = xiaoBai;

        Dog *xiaoHei = xiaoBai;   //[xiaoBai retain]

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

        [xiaoBai release];

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

       xiaoXin.dog = xiaoHei;

        [xiaoXin release];

        

        

        

    }

    return 0;

}

 

你可能感兴趣的:(setter)