首页 文章

什么时候阻止在使用Self时会导致保留周期?

提问于
浏览
1

我的应用程序中有一些内存问题泄漏,我想知道块是否可能与它有关 . 我已经读过在一个块中使用Self会导致保留周期,但是我已经阅读了有关何时发生这种情况的冲突信息 .

根据我的理解,做这样的事情:

dispatch_async(dispatch_get_main_queue(), ^{
        self.text = @"test";
        [self doSomething];
});

要么

[self.dataArrayOfDictionaries enumerateObjectsUsingBlock:^(NSDictionary *vd, NSUInteger idx, BOOL *stop) {
       [self doSomethingWithDictionary:vd];
}];

保留自己,直到做完事情,这样的事情:

[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
 if (data) {
  NSError *err;
    self.myDataArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&err];
  dispatch_async(dispatch_get_main_queue(), ^{
    [self.tableView reloadData];
  });
 }

在下载完成并重新加载表视图之前保留self . 因此,虽然这段代码可能会比自己需要更长时间保留Self,但它不会无限期地保留它,对吧?

另外,我假设这个WOULD会导致一个保留周期,如果在块完成中引用self,因为块被自己保留...对吗?

@interface MyViewController
@property (strong, nonatomic) void (^complete)(NSData *results);
@end
@implementaiton MyViewController
[self doStuffWithCompletion:self.complete];

我不确定保留周期是这样的 .

[[NSNotificationCenter defaultCenter]addObserverForName:@"thingDone" object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
 self.dataObject = note.object;
 }];

我听说NSNotificationCenter不会保留它的观察者,但因为这个函数永远不会像前两个那样“完成”,我觉得它可能会保留Self . 另外,如果我使用了weakSelf,如果收到通知并且self已被释放,那么应用程序是否会崩溃,因为weakSelf会为零?

我在导航控制器中有一个视图控制器,当敲击/弹出时它没有解除分配,我认为这可能是因为保留周期 . 如果有人能够澄清我对在块中使用Self的理解是可以接受的,那将极大地帮助我的代码 .

1 回答

  • 2

    我不确定保留周期是这样的[[NSNotificationCenter defaultCenter] addObserverForName:// ...

    是的,可能存在与调用 addObserverForName: 相关的内存管理问题 . 正如我解释in my book

    • 通知中心保留从 addObserverForName:object:queue:usingBlock: 调用返回的观察者令牌,直到您取消注册它为止 .

    • 观察者令牌也可能会阻止你穿过街区 . 如果是这样,那么在您从通知中心取消注册观察员令牌之前,通知中心将保留您 . 这意味着在您取消注册之前,您将会泄漏 . 但是您无法从 dealloc 中的通知中心取消注册,因为只要您已注册,就不会调用 dealloc .

    • 此外,如果您还保留观察者令牌,那么如果观察者令牌保留您,则您的手上有一个保留周期 .

    您可能希望阅读本书中的其余讨论,以获取实际示例和解决方案 .

相关问题