了解使用仪器保留Objective-C中的计数(泄漏)

时间:2016-11-09 08:40:35

标签: ios objective-c memory-leaks

我目前正在修复SDK中的内存泄漏。我主要在强引用和类方法中获得内存泄漏。由于我对内存管理缺乏了解,我发现很难解决这些漏洞。我已经阅读了很多关于内存管理的内容,但我仍然无法确定问题的位置。所以,我想我应该首先知道如何通过查看代码来平衡保留/释放。结果我关掉ARC做了一点测试。

这是我的源代码:

ViewController.h

@interface ViewController : UIViewController

@property (nonatomic, assign) IBOutlet UILabel *lLineOne;
@property (nonatomic, assign) IBOutlet UILabel *lLineTwo;

@end

ViewController.m

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *test = [[NSString alloc] initWithFormat:@"%@ %d", @"Test", 1];

    _lLineOne.text = test;

    _lLineOne.text = nil;
}

@end 

我几乎知道这肯定会导致泄密,因为我没有发布test

然后我使用仪器(泄漏)检查保留/释放列表。以下是我从该字符串的历史中得到的内容

enter image description here

我知道事件#0是malloc会将保留计数增加到1,然后将NSString设置为UILabel的属性也会将保留计数增加1,这样就可以得到一个2.我猜CFRetain是在NSString allocInitWithFormat的代码中发生的较低级别,但我不确定为什么它会导致另一个+1。接下来,在第3项赛事中保留的是什么?它似乎是由UILabel引起的,但我真的不知道它到底是什么。

1 个答案:

答案 0 :(得分:1)

首先是标准警告:不建议尝试跟踪保留计数,原因很简单,通常情况下,您无法知道它应该是什么。

您正在寻找您不需要的答案。大多数情况下,您在手动内存中真正需要知道的是,如果您创建或保留,则您有责任安排发布。

在您的示例中,您创建了字符串,因此您必须在不再需要它之后安排它。 UILabel可以根据自己的选择复制或保留,您不需要知道 - 您必须信任它遵守规则。

"大部分时间"以上主要是与代表们有关。作为委托传递的对象通常不被被调用者保留,只要被调用者需要它就让调用者保持对象。

HTH