【发布时间】:2014-01-06 06:29:36
【问题描述】:
我在我的非弧项目中使用苹果的 Reachabilry 类。当我用仪器运行它来查找内存泄漏时,它指的是可达性方法。问题来了:
+ (instancetype)reachabilityWithAddress:(const struct sockaddr_in *)hostAddress;
{
SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *)hostAddress);
WReachability* returnValue = NULL;
if (reachability != NULL)
{
returnValue = [[self alloc] init];
if (returnValue != NULL)
{
returnValue->reachabilityRef = reachability;
returnValue->localWiFiRef = NO;
}
}
return returnValue;
}
泄露的对象是可达性和returnValue。 我知道 SCNetworkReachabilityCreateWithAddress 创建了一个新实例,我必须 CFRelease 它,但它发生在 dealloc 中!
- (void)dealloc
{
[self stopNotifier];
if (reachabilityRef != NULL)
{
CFRelease(reachabilityRef);
}
[super dealloc];
}
那么我该怎么做才能避免这里的内存泄漏?
更新: 也许问题在于如何调用可达性?我用这个方法:
+ (instancetype)reachabilityForInternetConnection;
{
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
return [self reachabilityWithAddress:&zeroAddress];
}
然后我这样调用可达性:
[[Reachability reachabilityForInternetConnection] startNotifier];
并且不要将它分配给任何对象,只需使用这一行。 我试图将此调用更改为:
Reachability *reachability = [[Reachability reachabilityForInternetConnection] autorelease];
[reachability startNotifier];
但是在这个分析器告诉我“autorelease 太多”之后。
【问题讨论】:
标签: ios objective-c xcode memory-leaks reachability