对象的潜在泄漏,即使在 ARC 中?
Posted
技术标签:
【中文标题】对象的潜在泄漏,即使在 ARC 中?【英文标题】:Potential leak of an object, even in ARC? 【发布时间】:2012-11-05 10:49:31 【问题描述】:我正在使用以下代码并且正在使用 ARC
NSString *text;
static NSString *CellIdentifier=@"Cell";
FeedsCell *cell= [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[FeedsCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
if (indexPath.row == [feedsData count]-1)
[spinner startAnimating];
[spinner setHidesWhenStopped:YES];
OnDemand_fetch *getData = [[OnDemand_fetch alloc] init];
if(nextUrl != NULL)
NSString *nextfbUrl = [getData getnextFbfeedUrl];
NSString *nexturlEdited = [nextfbUrl stringByReplacingOccurrencesOfString:@"|" withString:@"%7C"];
[demandfetch getFeedsInBackground:nexturlEdited];
else
[spinner stopAnimating];
self.myTableView.tableFooterView=nil;
在分析时,显示警告: “在第 267 行分配并存储到 'getData' 中的对象的潜在泄漏。”
谁能建议避免这种情况的方法?这会造成什么麻烦吗?
谢谢
【问题讨论】:
你确定是 ARC 吗?这对我来说看起来不错。getData
是否在其他地方使用过?
是的..我确定,我不会在其他任何地方使用 getData 对象。
将OnDemand_fetch *getData = [[OnDemand_fetch alloc] init];
更改为OnDemand_fetch *getData = [[[OnDemand_fetch alloc] init] autorelease];
。这会在构建时带来任何错误吗?
没有错误!但我正在使用 ARC!为什么会有这种奇怪的行为?
如果编译器允许你使用autorelease
,那么你就没有使用ARC。 ARC 禁止调用 autorelease。
【参考方案1】:
没有错误!但我正在使用 ARC!为什么会有这种奇怪的行为?
因为...您没有使用 ARC。不知道为什么你认为你是。要转换为 ARC,请转到 Edit->Refactor->Convert to Objective-C ARC。
如果你不想全力以赴,ARC 一切,你可以将-fobjc-arc
作为编译器标志添加到你想使用 ARC 的文件中,项目不是 ARC。
【讨论】:
注意:您需要将项目中的每个目标单独转换为 ARC!我自己遇到了这个,以为我已经转换为 ARC,但没有。要检查:项目 -> 目标 -> 构建设置,查看 CLANG_ENABLE_OBJC_ARC 是否设置为是。 (使用过滤框搜索“arc”)【参考方案2】:您只在if(nextUrl != NULL)
块内使用getData
对象,您可以尝试将其移动到该块并在末尾设置为nil
,如下所示:
if(nextUrl != NULL)
OnDemand_fetch *getData = [[OnDemand_fetch alloc] init];
NSString *nextfbUrl = [getData getnextFbfeedUrl];
NSString *nexturlEdited = [nextfbUrl stringByReplacingOccurrencesOfString:@"|" withString:@"%7C"];
[demandfetch getFeedsInBackground:nexturlEdited];
getData = nil;
【讨论】:
如果他真的在使用 ARC,则不需要这样做。 ARC 会识别对象何时超出范围并释放它。 完全同意,我认为问题在于他没有在这个特定文件中使用 ARC以上是关于对象的潜在泄漏,即使在 ARC 中?的主要内容,如果未能解决你的问题,请参考以下文章