【问题标题】:Why is it not giving memory leak?为什么它不给内存泄漏?
【发布时间】:2017-06-08 00:23:15
【问题描述】:

我有这段代码(根据我正在关注的教程修改):

#import <Foundation/Foundation.h>


@class Car;
@class Person;

@interface Person: NSObject

@property Car* owningCar;

@end


@implementation Person:NSObject

-(void)dealloc {
    NSLog(@"Person is gone");
}

@end


@interface Car:NSObject

@property Person* owner;

@end

@implementation Car:NSObject

-(void)dealloc {
    NSLog(@"Car is gone");
}

@end




void testRefCycle () {
    Person* me = [[Person alloc] init];
    Car* civic = [[Car alloc] init];
    me.owningCar = civic;
    civic.owner = me;
}



int main(int argc, const char * argv[]) {
    @autoreleasepool {
        testRefCycle();
    }
    return 0;
}

我打开 Profiler Leaks 并运行它,希望得到 Leaks,但没有任何显示。如果这创建了一个引用循环,为什么没有泄漏?

当我运行项目时,也没有输出。没有泄漏为什么没有输出?

【问题讨论】:

    标签: objective-c memory-leaks


    【解决方案1】:

    有泄漏,这就是没有输出的原因——你的 dealloc 方法永远不会运行。

    但是检漏仪从来没有机会检测到它,因为您的程序会在百万分之一秒内结束。从长远来看,您没有任何持久状态,这是将某些东西算作泄漏所需要的。

    如果您在应用程序中运行testRefCycle,例如,应用程序本身会随着时间的推移而持续存在,您会看到报告的泄漏。但是你不会在没有运行循环的单行命令行程序中看到它,这就是你所拥有的。

    【讨论】:

    • 这很奇怪,它只在我最后添加getchar 后的第 6 秒捕获泄漏。我猜 Profiler 确实有其局限性。
    • 分析器的工作原理是每隔几分之一秒暂停您的应用程序并拍摄使用过的指针的快照。因此,如果您的程序运行时间不够长,它将没有足够的数据。测试这样的短代码的一种简单方法是将其放入循环中,然后运行几千次左右。这样做的另一个优点是任何小的泄漏都会经常重复,因此更容易发现。
    猜你喜欢
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 2015-08-04
    相关资源
    最近更新 更多