ios - 为什么阻止对象不能像NSObject一样释放内存?

标签 ios objective-c memory-management objective-c-blocks

这是说明问题的代码片段

__weak id ptr = nil;
__weak id ptr2 = nil;
@autoreleasepool {
    void (^block)(void) = [^{
        NSLog(@"hahaha");
    } copy];
    block();
    [[(id)block rac_willDeallocSignal] subscribeCompleted:^{
        NSLog(@"block will dealloc");
    }];
    ptr = block;
    int blockRetainCount = CFGetRetainCount((__bridge CFTypeRef)block);

    NSObject *obj = [[NSObject alloc] init];
    [obj.rac_willDeallocSignal subscribeCompleted:^{
        NSLog(@"Obj dealloc");
    }];
    ptr2 = obj;
    int objRetainCount = CFGetRetainCount((__bridge CFTypeRef)obj);
    NSLog(@"oK");
}
NSLog(@"after pool %@ %@" , ptr, ptr2);

当我运行此代码片段时,我会看到Obj dealloc打印到控制台,但没有block will dealloc。在自动释放池之后,我还将看到ptr仍包含对该块的有效引用,而ptr2已正确地重置为预期的nil。为什么会有这种差异?什么时候块会全部取消分配?

最佳答案

应该说服您不要尝试这种事情的多个问题:

第一,在存在ARC的情况下,不能保证CFGetRetainCount返回任何有意义的东西。

第二,不能保证一个块完全使用保留计数。没有捕获任何变量的块被分配为静态变量;复制,保留等等对它们什么也不做,并且永远不会分配或释放它们。

第三,不能保证任何块在释放后都将调用dealloc。并且不能保证它将在下一个OS或iOS版本中发生。

关于ios - 为什么阻止对象不能像NSObject一样释放内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25532433/

相关文章:

objective-c - 为什么[self.property release]会导致静态分析器显示 "incorrect decrement of the reference count"错误?

ios - 如何向第 3 方 iOS 库添加功能?

objective-c - 将 NSDictionary UIView 对象传递给 NSDictionaryOfVariableBindings/Autolayout

ios - UIPageViewController 在动画时按住按钮时崩溃

ruby - 为什么内存中的值与我的 ruby​​ 程序中的值不同?

memory-management - 在 Julia 中释放内存

iphone - 应用程序在设备上运行和安装的时间太长

iphone - 如何在 iOS 6 中获取 GMT 格式的时区

ios - 带有 Objective-C 次要进度的进度 View (三色进度条)

ios - 适用于 iOS 的 AdMob 错误 : Llibrary not found for -lGoogleAdMobAds