消息发送到从未发布的解除分配的实例

时间:2010-04-11 12:57:15

标签: iphone concurrency

我开始处理NSOperations并且(和通常一样)我正在观察奇怪的行为。 在我的班上,我有一个实例变量:

    NSMutableArray *postResultsArray;

当按下UI中的一个按钮时,我初始化数组:

postResultsArray = [NSMutableArray array];

并设置操作(连同依赖项)。

在操作中,我创建了一个自定义对象并尝试添加到数组中:

PostResult *result = [[PostResult alloc] initWithServiceName:@"Sth" andResult:someResult];
[self.postResultsArray addObject:result];

在添加时我得到:

  

- [CFArray retain]:发送到解除分配的实例0x3b40c30的消息

这很奇怪,因为我没有在我的代码中的任何地方释放数组(我做了,但是当问题开始出现时,我评论了所有的发布操作,以确保它们不是这种情况)。我也习惯了@synchronized部分,如下所示:

PostResult *result = [[PostResult alloc] initWithServiceName:@"Sth" andResult:someResult];
    @synchronized (self.postResultsArray) {
        [self.postResultsArray addObject:result];
    }

但问题是相同的(但错误是同步操作)。

任何想法我可能做错了什么?

1 个答案:

答案 0 :(得分:2)

postResultsArray = [NSMutableArray array];

[NSMutableArray array]是一种方便的方法,相当于[[[NSMutableArray alloc] init] autorelease]。所以那里有隐式(自动)版本。由于你要保留它,你必须使用以下3个变化之一:

  1. postResultsArray = [[NSMutableArray array] retain];
    
  2. postResultsArray = [[NSMutableArray alloc] init];
    
  3. 利用setter应该保留新值的事实(如果你声明为@property(retain)):

    self.postResultsArray = [NSMutableArray array];