0

我正在使用仪器的泄漏工具。它说我在 init 方法中有一些泄漏。它表明 NSMutableArray 有泄漏。

我没有看到任何泄漏。

@interface BookSettings : NSObject
  @property (nonatomic, retain) NSString *title;
  @property (nonatomic, retain) NSMutableArray *authors;
@end

- (id)init 
{
   self = [super init];

   if(self) 
   {
    title           = [[NSString stringWithString:@""] retain];
    authors         = [[NSMutableArray alloc] init];
   }
   return self;
}

- (void)dealloc 
{
 [title release];
 [authors release];
 [super dealloc];
}
4

2 回答 2

2

提供的代码没问题,问题出在没有平衡版本的情况下保留作者的其他地方。泄漏只是指向创建 ivar 的位置,而不是缺少的版本应该在哪里。检查保留计数增加的所有地方。

如果您需要查看对象使用工具的保留、释放和自动释放发生的位置:

在仪器中运行,在分配中设置“记录参考计数”(您必须停止记录才能设置选项)。导致问题代码运行,停止记录,搜索感兴趣的 ivar,向下钻取,您将能够看到所有保留、释放和自动释放发生的位置。

认真考虑使用 ARC,没有理由不这样做,ARC 支持回 iOS 4.x。

顺便提一句:

title = [[NSString stringWithString:@""] retain];

可以写得更简洁:

title= @"";
于 2012-04-09T13:01:04.760 回答
0

我认为是从标题。您已经拥有该属性非原子,保留,所以这意味着保留计数为 1。

然后您指定另一个保留,使保留计数为 2。

在 dealloc 中,您释放它一次,将保留计数减少到 1。因此,保持字符串保留的这个 1 引用就是泄漏。

我不明白你为什么要这样初始化字符串......

于 2012-04-09T10:40:58.187 回答