• 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;
    }
  • 相关阅读:
    TF-IDF
    智力题
    max{X,Y}和min{X,Y}的概率分布
    K-Means
    提高工作效率:给设计师的10条建议
    每个软件工程师都应该尝试的5件事
    CSS sprite 圆角——源代码
    比较大气的网页元素
    彩色网页变黑白色CSS代码变黑白色调!
    jquery适用技巧
  • 原文地址:https://www.cnblogs.com/0515offer/p/4586959.html
Copyright © 2020-2023  润新知