08-09、A对象与B对象的“循环retain”的解决方案

Snip20170925_60.png
main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"

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

Person *p = [Person new];
Dog *d = [Dog new];

// 如果A对用要拥有B对象, 而B对应又要拥有A对象, 此时会形成循环retain
// 如何解决这个问题: 不要让A retain B, B retain A
// 让其中一方不要做retain操作即可
p.dog = d; // retain
d.owner = p; // retain  assign

[p release];
[d release];

return 0;
}
Person.h
#import <Foundation/Foundation.h>
@class Dog;

@interface Person : NSObject

@property(nonatomic, retain)Dog *dog;
@end
Person.m
#import "Person.h"
#import "Dog.h"

@implementation Person


- (void)dealloc
{
NSLog(@"%s", __func__);
//    [_dog release];
self.dog = nil;//装B写法
[super dealloc];
}
@end
Dog.h
  #import <Foundation/Foundation.h>
@class Person;

@interface Dog : NSObject

//@property(nonatomic, retain)Person *owner;
@property(nonatomic, assign)Person *owner;
@end
Dog.m
#import "Dog.h"
#import "Person.h"

@implementation Dog

-(void)dealloc
{
NSLog(@"%s", __func__);
//    [_owner release];
//    self.owner = nil;//由于Dog没有对Person进行retain操作所以没必要进行release操作。
[super dealloc];
}
@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 学习目标 1.【理解】对象在内存中的存储 2.【理解】nil和NULL 3.【了解】#pragma mark分组导...
    Hm丶阅读 594评论 0 3
  • 一、春梦 如果不是三白,如果不是《浮生六记》,谁曾想到生活原来可以如此这般细致,谁又曾想,世间竟有像芸这般可爱的女...
    北城小妖阅读 277评论 0 1
  • 四月已然四月 四月我若无旁骛 四月内我是天空里的星辰 你是夜空那划过的一束
    心木睿阅读 140评论 0 0
  • 儿子上了初中以后,特别是今年,回来都不愿意和我说话了。这次回老家,他是一百个不愿意,我说了很多好话才同意回来的。他...
    月儿的2016阅读 158评论 0 0

友情链接更多精彩内容