2016-11-09 56 views
0

我目前正在修复我们SDK中的内存泄漏。我主要在强引用和类方法中获取内存泄漏。由于缺乏对内存管理的理解,我发现很难解决这些泄漏问题。我已经阅读了很多关于内存管理的知识,但仍然无法确定问题出在哪里。所以,我认为我应该首先了解如何通过查看代码来平衡保留/释放。因此,我关掉了ARC进行了一些测试。了解Objective-C中的保留计数使用仪器(泄漏)

这是我的源代码:

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 

我几乎知道,这肯定会导致泄漏,因为我没有” t得到释放test

然后我使用仪器(泄漏)来检查保留/发布列表。这里是我从该字符串的历史

enter image description here

我知道,事件#0也就是的malloc将递增保留计数为1了,再接着通过设置NSString到的UILabel的财产也会增加保留计数1,所以给我们一个2.我猜CFRetain是在NSString allocInitWithFormat的代码中发生的较低级别的事情,但我不确定为什么它会对另一个+1做出贡献。接下来,在事件#3中保留什么?看起来它是由UILabel引起的,但我真的不知道它到底是什么。

回答

1

首先是标准警告:不建议尝试跟踪保留计数,因为简单的原因,通常不可能知道它应该是什么。

您正在寻找一个你不需要的答案。大多数情况下,您在手动记忆中需要知道的是,如果您创建或保留您负责安排发布。

在你的例子中,你创建了字符串,所以你必须在你不再需要它的时候安排它。 UILabel可以根据自己的选择复制或保留,您不需要知道 - 您必须信任它遵循规则。

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

HTH

+0

了解。谢谢 –