Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么仪器认为这是内存泄漏?_Objective C_Cocoa Touch - Fatal编程技术网

Objective c 为什么仪器认为这是内存泄漏?

Objective c 为什么仪器认为这是内存泄漏?,objective-c,cocoa-touch,Objective C,Cocoa Touch,我有一个关于视图,我将其推到NavigationController上。该视图有一个连接到IBOutlet的UILabel。在viewDidLoad中,我用包版本号(字符串)填充UILabel。使用仪器进行的测试表明,标有注释的行正在泄漏内存:- viewDidLoad { [super viewDidLoad]; self.title = @"About"; // Line below is the suggested culprit *** NSString

我有一个关于视图,我将其推到NavigationController上。该视图有一个连接到IBOutlet的UILabel。在viewDidLoad中,我用包版本号(字符串)填充UILabel。使用仪器进行的测试表明,标有注释的行正在泄漏内存:-

viewDidLoad {
    [super viewDidLoad];

    self.title = @"About";
    // Line below is the suggested culprit ***
    NSString *versionLabel = [[NSString alloc] initWithFormat:@"Version %@", 
                              [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString *)kCFBundleVersionKey]];

    self.applicationVersion.text = versionLabel;
    [versionLabel release];
    versionLabel = nil;
}
我假设它是在暗示NSString,而不是在线上的其他任何东西


我的问题是为什么?

您甚至不需要创建NSString的实例。在这种情况下,只需使用作用于NSString类(而不是实例)的以下方法即可:


如果以这种方式使用NSString,则不必释放versionLabel,因为从未分配内存。

我怀疑您正在泄漏
applicationVersion
UILabel。这将导致管柱作为副产品泄漏。在iPhone上出现这种情况的最常见原因是没有遵守规则。

实际上可能是mainBundle或infoDictionary正在泄漏-可能是系统正在缓存其中的一个或另一个,因此它们被创建,然后再也不会发布

尝试向应用程序中添加IDFinish启动代码:

[[NSBundle mainBundle] infoDictionary];

无任何其他代码,并查看泄漏是否指向该线作为泄漏位置。在这种情况下,缓存是问题所在,您可以忽略它。

此代码中分配的内存与原始代码中的内存相同。分配的NSString实例只是为您自动释放。这就是我在实际调查泄漏之前的做法。根据Nib内存管理规则,我应该在setView中释放IBOutlet(如果视图为nil),因为UIViewController将其dealloc作为setView实现。如果我在viewDidLoad、setView和Dealloc中添加NSLog消息,我就不会注意到这一点。我所观察到的是dealloc接到电话,就这样。我从setView中看到的唯一日志消息是当Xib加载时?????谢谢,我会尝试的。当我进入仪器下的AboutView时,我只会每隔5到6次看到一个链接。。。
[[NSBundle mainBundle] infoDictionary];