需要有关内存管理的帮助

时间:2018-01-03 07:24:37

标签: ios objective-c swift memory-management memory-leaks

vc2.h

@interface vc2 : UIViewController

@property (nonatomic, strong) NSDictionary *dict;

@end

vc2.m

- (instancetype)init
{
    self = [super init];
    if (self) {
        self.dict = @{@"self":self};
    }
    return self;
}

根VC

- (void)viewDidLoad {
    [super viewDidLoad];
    vc = [[vc2 alloc]init];
}

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:YES];
    vc = nil;
}

vc2NSDictionary个属性保留self我在根VC中将vc2设置为nil但是当我在乐器{{1}中检查时实例仍然存在。

当我设置vc2 weak属性NSDictionary实例在设置为vc2后被释放,但是Xcode给了我这个警告将字典文字分配给弱属性;对象将在分配后发布

关于这种内存管理的情况如何?

1 个答案:

答案 0 :(得分:3)

好吧,如果对词典的引用是strongvc2会创建一个保留周期 - 它会通过字典引用自己。因此,从root中删除对它的引用不会有帮助,仍然至少存在一个引用 - 来自字典的引用。

这很简单 - 如果有对象的引用,则必须保留它,不能释放它。由于vc2包含对字典的引用,因此在vc2存在时无法释放字典。但是,字典本身包含对vc2的引用,因此在字典存在之前无法释放vc2。这是保留周期 - vc2使字典保持活动状态,字典使vc2保持活着

您可以使用weak引用类型来中断此循环 - 弱意味着此引用不会用于确定是否必须保留该对象。从保留/释放weak引用不被重视的角度来看。因此,当您创建字典属性weak时,您说vc2不应该使字典保持活动状态。换句话说,如果没有其他对象引用此字典,则vc2不应成为保留该字典的理由,在这种情况下,可以释放字典。但是,因为当您在vc2中创建字典时,对vc2的唯一引用是weak中的strong// here you create a dictionary and assign it to your weak dict property self.dict = @{@"self":self}; // but right here, after executing it, the only reference to the created dictionary // is the weak one - that means that the dictionary can be released! // thus, if you try to print dict right on the next line, it will be nil // because it was released right after creation 引用该字典,防止释放它。结果如下:

weak

使用strong字典引用的问题。只有在至少有一个strong引用时,才会保留(存在)每个对象。但在这种情况下,糟糕的字典将不会获得单个strong引用。

这里你想要的是vc2对字典的引用。这将确保在weak存在时字典将存在。但是你需要在某个地方打破保留周期。识别应该是vc2的内容非常简单:只要问哪个对象应该依赖于哪个:

  • 可以发布字典,vc2存在吗?
  • 不,它不能,在vc2存在时应保留字典。
  • 可以释放vc2,而字典存在吗?
  • 是的,它可以!事实上,当vc2被释放时,这也是字典可以发布的重点。

这意味着字典依赖于vc2,反之亦然。因此,您需要从vc2到字典的强引用 - 这将确保在vc2存在时,字典存在。但是你不希望字典存在以保持vc2保留 - 当其他对象释放vc2时,字典不能保持weak活着。因此,您需要从字典vc2引用strong,而不是self。这应该指向正确的方向 - 您要添加到字典中的weak引用应该是var gulpwatch = require('gulp-watch'); var source = './assets', destination = './dest'; gulp.task('copy-changed-assets', function() { gulpwatch(source+'/**/*', function(obj){ gulp.src( obj.path, { "base": source}) .pipe(gulp.dest(destination)); }); });

请查看此SO question以获取有关如何处理字典中弱条目的一些建议。