【问题标题】:Automatic Reference Counting not working [duplicate]自动引用计数不起作用[重复]
【发布时间】:2012-02-14 10:39:10
【问题描述】:

可能重复:
Why is object not dealloc'ed when using ARC + NSZombieEnabled

我一定是在这里做错了什么。 Compiler 设置为 Apple LLVM Compiler 3.0,Objective-C Automatic Reference Counting 设置为 YES。我还包含需要激活 ARC 的第 3 方软件。

所以我的基本问题是我的属性没有被释放。我有以下标题:

@interface ArchiveController : UIViewController <CloseSubviewDelegate> {
  NSArray *journals;
  NSMutableArray *archiveViews;
}

@property (nonatomic, strong) NSArray *journals;
@property (nonatomic, strong) NSMutableArray *archiveViews;

....

@end

我合成了这些并像这样初始化archiveViews数组:

self.archiveViews = [NSMutableArray array];

后来我向它添加对象,一切正常; journals 数组也一样。

我添加了一个 dealloc 方法来检查 ArchiveController 是否被释放:

-(void)dealloc
{
   DLog(@"dealloc archive controller");
}

可行,但数组永远不会被释放;为什么?如果我将 dealloc 方法更改为:

-(void)dealloc
{
  DLog(@"dealloc archive controller");
  self.archiveViews = nil;
}

一切正常,但这不应该是这样,对吧?我 100% 确定该数组及其对象没有在其他任何地方引用。

预处理器不应该处理所有保留/释放/释放的插入吗?当我让 Xcode 生成预处理输出时,似乎什么都没有改变!

【问题讨论】:

  • 你怎么知道数组没有释放?
  • 可以通过在构建阶段区域添加每个文件的编译标志来逐个文件关闭 ARC。大概情况并非如此,但可能值得仔细检查。关闭此功能的标志是-fno-objc-arc
  • 因为数组中的对象永远不会被释放。感谢 Kevin 的注意,但事实并非如此。

标签: ios automatic-ref-counting


【解决方案1】:

我怀疑是循环依赖。

仪器有时可以帮助您找到它们。

【讨论】:

  • 如果这里有一个retain循环,那么他的-dealloc根本不会被调用,这意味着self.archiveViews = nil;永远不会被运行。
猜你喜欢
  • 1970-01-01
  • 2018-11-07
  • 2013-10-29
  • 1970-01-01
  • 2015-04-14
  • 2019-01-23
  • 2012-10-22
  • 2012-12-05
  • 2019-01-23
相关资源
最近更新 更多