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;
}
vc2
强NSDictionary
个属性保留self
我在根VC中将vc2
设置为nil
但是当我在乐器{{1}中检查时实例仍然存在。
当我设置vc2
weak
属性NSDictionary
实例在设置为vc2
后被释放,但是Xcode给了我这个警告将字典文字分配给弱属性;对象将在分配后发布
关于这种内存管理的情况如何?
答案 0 :(得分:3)
好吧,如果对词典的引用是strong
,vc2
会创建一个保留周期 - 它会通过字典引用自己。因此,从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以获取有关如何处理字典中弱条目的一些建议。