检测设备信息时的潜在内存泄漏

Posted

技术标签:

【中文标题】检测设备信息时的潜在内存泄漏【英文标题】:Potential Memory leak when detecting device information 【发布时间】:2013-11-20 01:44:53 【问题描述】:

我在下面的代码中有内存泄漏,但我真的不知道如何修复它。我试着让 machine = nil;但这没有用。有人有什么建议吗?提前致谢。

size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *machine = malloc(size);
sysctlbyname("hw.machine", machine, &size, NULL, 0);
NSString *platform = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding];
if ([platform isEqualToString:@"iPhone3,1"] || [platform isEqualToString:@"iPhone3,2"] || [platform isEqualToString:@"iPhone3,3"] || [platform isEqualToString:@"iPhone4,1"])
            [UINavigationBar appearance].barTintColor = [UIColor colorWithRed:255.0/255.0 green:220.0/255.0 blue:0.0/255.0 alpha:0.9];
machine = nil;

我在 stringWithCSString:machine:potential leak of memory pointed to by 'machine' 中发现了泄漏。

【问题讨论】:

顺便说一句 - 好奇为什么您需要为这 4 款设备使用不同的色调? @rmaddy 好吧,我看到 ios7.0.1-iOS7.0.3 发生了不同的半透明/alpha 变化。所以我试图尽可能地中和它,似乎iPhone4像iOS7.0.1一样对待iOS7.0.3半透明。我相信 Apple 对带有 AppleMaps 的 NavigationBar 进行了一些更改,他们曾经强制半透明的导航栏深灰色。半透明工具栏有什么问题吗?或苹果地图。 @rmaddy 如果您想阅读更多内容,这里有一篇关于我正在谈论的内容:***.com/questions/19534473/… 【参考方案1】:

malloc 的调用需要与对free 的调用配对。

machine = nil 更改为free(machine)

顺便说一句 - 你的代码变得更容易了:

#include <sys/utsname.h>

struct utsname si;
uname(&si);
if (strcmp(si.machine, "iPhone3,1") == 0 || strcmp(si.machine, "iPhone3,2") == 0 || strcmp(si.machine, "iPhone3,3") == 0 || strcmp(si.machine, "iPhone4,1") == 0) 

无需内存管理或创建NSString 对象。

【讨论】:

utsname 和 uname 有什么作用?那究竟是什么?谢谢,这对我来说是新信息。 这些功能与您的代码完全相同,但方式更简单。 uname 是一个 C 函数。

以上是关于检测设备信息时的潜在内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

分析仪结果与仪器泄漏:iPhone 内存泄漏

潜在的内存泄漏 abaddressbookcopyarrayofallpeople( )

iOS - XCode 4.4 - 使用分析的潜在内存泄漏

Tomcat 停止线程以避免潜在的内存泄漏

潜在的弹簧安全内存泄漏

想知道我是不是有内存泄漏(报告为潜在)