【问题标题】:Retain cycles and Instruments保留循环和仪器
【发布时间】:2014-10-08 14:24:03
【问题描述】:

我刚刚写了这个保留循环:

#import <Foundation/Foundation.h>
#import "Driver.h"
#import "Car.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Driver *driver = [[Driver alloc] init];
        Car *car = [[Car alloc] init];

        driver.car = car;
        car.driver = driver;
    }
    sleep(100);
    return 0;
}

显然,Driver 和 Car 具有很强的属性。

无论如何,Instruments 没有在 Xcode 6.1 上的 Leaks -> Cycles & Roots 中显示保留周期。

这是一个保留循环,对吗?那么发生了什么?

【问题讨论】:

  • 如果我不得不猜测,它不会被检测为保留周期,因为它们都在函数结束时超出了范围,从而使它们同时被安排进行清理。不过,我不是 100% 的。

标签: ios objective-c instruments retain-cycle


【解决方案1】:

保留周期不是泄漏。当您丢失对象的跟踪(参考)时,就会发生泄漏。由于两个对象都引用了另一个对象,因此它不被视为泄漏。因此,保留周期比泄漏更难找到。这取决于你的代码,你应该小心。

【讨论】:

  • 如果我将 drivercar 两个指针都设置为 nil 会发生什么?它们不能被释放,因为保留周期所以它们会泄漏。仍然没有出现在 Instruments 上。
  • 仪器仍然不会显示为泄漏。从技术上讲,他们仍然有指针。也许计时器会打破保留周期?它无法分辨。
【解决方案2】:

好的,现在可以使用了:

@autoreleasepool {
    Driver *driver = [[Driver alloc] init];
    Car *car = [[Car alloc] init];

    driver.car = car;
    car.driver = driver;

    driver = nil;
    car = nil;

    for (size_t i = 0; i < 100000; i++) {
        driver = [[Driver alloc] init];
        car = [[Car alloc] init];
    }
}

使用此代码,Instruments 会在 Leaks 上显示循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多