gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 00:36:22 26 4
gpt4 key购买 nike

我目前正在修复 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

我知道 event#0(即 malloc)会将保留计数增加到 1,然后将 NSString 设置为 UILabel 的属性也会将保留计数增加 1,这样给我们一个 2。我猜 CFRetain 是在 NSString allocInitWithFormat 代码中较低级别发生的事情,但我不确定为什么它会导致另一个 +1。接下来,event#3 中的 Retain 是什么?看起来它是由 UILabel 引起的,但我真的不知道它到底是什么。

最佳答案

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

您正在寻找不需要的答案。大多数时候,您真正需要知道的是,在手动内存下,您是否创建或保留,您有责任安排释放。

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

上面的“大部分时间”主要与代表有关。作为委托(delegate)传递的对象通常不会被被调用者保留,从而让调用者在被调用者需要时保留该对象。

HTH

关于ios - 使用仪器了解 Objective-C 中的保留计数(泄漏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40502770/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com