我目前正在修复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
。
然后我使用仪器(泄漏)检查保留/释放列表。以下是我从该字符串的历史中得到的内容
我知道事件#0是malloc会将保留计数增加到1,然后将NSString
设置为UILabel的属性也会将保留计数增加1,这样就可以得到一个2.我猜CFRetain是在NSString allocInitWithFormat的代码中发生的较低级别,但我不确定为什么它会导致另一个+1。接下来,在第3项赛事中保留的是什么?它似乎是由UILabel引起的,但我真的不知道它到底是什么。
答案 0 :(得分:1)
首先是标准警告:不建议尝试跟踪保留计数,原因很简单,通常情况下,您无法知道它应该是什么。
您正在寻找您不需要的答案。大多数情况下,您在手动内存中真正需要知道的是,如果您创建或保留,则您有责任安排发布。
在您的示例中,您创建了字符串,因此您必须在不再需要它之后安排它。 UILabel
可以根据自己的选择复制或保留,您不需要知道 - 您必须信任它遵守规则。
"大部分时间"以上主要是与代表们有关。作为委托传递的对象通常不被被调用者保留,只要被调用者需要它就让调用者保持对象。
HTH