如何解决此内存泄漏?

Posted

技术标签:

【中文标题】如何解决此内存泄漏?【英文标题】:How to resolve this memory leak? 【发布时间】:2012-06-13 18:35:43 【问题描述】:

我从 servin.com 网站获得了以下代码。尽管代码有效,但 Instruments 报告了内存泄漏。我在代码中看不到任何分配、保留、复制,因此我无法弄清楚如何解决此内存泄漏。 Instruments 的代码和结果如下。任何帮助,将不胜感激。

// Part 1 - Create Internet socket addr of zero
struct sockaddr_in zeroAddr;
bzero(&zeroAddr, sizeof(zeroAddr));
zeroAddr.sin_len = sizeof(zeroAddr);
zeroAddr.sin_family = AF_INET;

// Part 2- Create target in format need by SCNetwork
SCNetworkReachabilityRef target = 
SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *) &zeroAddr);

// Part 3 - Get the flags
SCNetworkReachabilityFlags flags;
SCNetworkReachabilityGetFlags(target, &flags);

// Part 4 - Create output
NSString *sNetworkReachable;
if (flags & kSCNetworkFlagsReachable)
    sNetworkReachable = @"YES";
else
    sNetworkReachable = @"NO";

NSString *sCellNetwork;
if (flags & kSCNetworkReachabilityFlagsIsWWAN)
    sCellNetwork = @"YES";
else
    sCellNetwork = @"NO";


NSLog (@"Network Reachable: %@", sNetworkReachable);
NSLog (@"Cell Network: %@", sCellNetwork);

仪器结果...

泄漏对象 - # - 地址 - 大小 - 负责库 - 负责框架

Malloc 16 字节 - 1 - 0x5141d50 - 16 字节 - SystemConfiguration - SCNetworkReachabilityCreateWithAddress

SCNetworkReachability - 1 - 0x51347b0 - 288 字节 - SystemConfiguration - SCNetworkReachabilityCreateWithAddress

【问题讨论】:

【参考方案1】:

泄漏在那里。完成所有代码后,您应该发布对target 的引用。来自苹果在SCNetworkReachabilityCreateWithAddress 上的文档:

返回值

一个新的不可变可达性引用。必须释放返回值。

尝试使用CFRelease(target) 函数来消除调用。如果您需要在函数调用之间保持引用 - 将其作为类中的实例变量。

【讨论】:

解决了!非常感谢。【参考方案2】:

如果你阅读了SCNetworkReachabilityCreateWithAddresss的文档

返回值

一个新的不可变可达性引用。您必须释放退回的 价值。

【讨论】:

以上是关于如何解决此内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone内存泄漏问题?

如何在 OnDestroy 中删除此 firebase 侦听器以减少内存泄漏?

键盘扩展内存泄漏?

哪些操作会造成内存泄漏以及如何解决内存泄漏

Android线程内存泄漏

智能指针(解决你的内存泄漏)