【问题标题】:what's the reason that there is no warning when I assign the NSBlockOperation object to a weak value当我将 NSBlockOperation 对象分配给弱值时没有警告的原因是什么
【发布时间】:2023-03-27 11:47:01
【问题描述】:
__weak NSBlockOperation *secondBlockOperation  = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"%@",secondBlockOperation);
    NSLog(@"this is the second block");
}];
__block __weak NSBlockOperation *secondBlockOperation  = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"%@",secondBlockOperation);
    NSLog(@"this is the second block");
}];
__block  NSBlockOperation *secondBlockOperation  = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"%@",secondBlockOperation);
    NSLog(@"this is the second block");
}];

这是我看不懂的代码。我发现 __block 会导致内存泄漏。所以我想到了 __block __weak 。好吧,根本没有泄漏。但是当我自定义一个类时将块作为强属性,像这样 __weak Person *one = nil; one = [[Person alloc] initWithBlock:^{ NSLog(@"%@",one); }]; 显示了弱分配警告。

说实话,我不明白当__block和__weak一起使用时的结果。__block值将是一个指向带有转发指针和值指针的结构的指针。所以weak是为指针工作的__block struct 或 __block struct 中的指针。为什么 __weak NSBlockOperation *secondBlockOperation 没有警告??!

【问题讨论】:

    标签: ios warnings block weak


    【解决方案1】:

    所有块操作通常应该是弱的。因为,如果块操作完成了,就没有必要把这个块对象保存在内存中了。 正如苹果文档 (https://developer.apple.com/library/ios/documentation/Cocoa/Reference/NSOperation_class/index.html#//apple_ref/occ/cl/NSOperation) 中所写:

    一个操作对象是一个单次对象——也就是说,它只执行一次它的任务,不能再次执行它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2021-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多