//
// 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 ;
}