我有一个char *,我用strtok处理它,并得到我用strdup得到的每一行代码的副本。此char *用作函数的参数,该函数将指针存储在保存NSPointerArray实例的NSMutableArray中。问题是,当我在dealloc中调用NSMutableDictionary上的release时,我得到了消息发送到已释放实例`的消息。所以我认为这里有一些可怕的错误…下面是一些代码:
proceedDataBlock = ^(const char *data){
NSDate *date = [NSDate date];
int counter = 0;
char *temp = strdup(data);
char *cline = strtok(temp, "\n");
Table *dataList = [[Table alloc] initWithType:m.Type groups:groupings];
while(cline)
{
// do something
[myObject addString:strdup(cline)];
cline = strtok(NULL, "\n");
}
free(temp);
[callbackObj performSelectorOnMainThread:@selector(recieveDataModelsFinished:)withObject:dataList自动释放waitUntilDone:是];}
myObject:addString如下所示:
-(void)addString:(char *)line
{
// models is an NSMutableArray
char cGroup = line[32];
NSString *group = [NSString stringWithFormat:@"%c", cGroup];
NSPointerArray *dataArray = [self.models objectForKey:group];
[dataArray addPointer:line];
}现在,当我释放我的对象时,dealloc被调用:
-(void)dealloc
{
[_models release];
[_type release];
[super dealloc];
}对于我的_models字典中的每个条目,我都会得到消息message send to deallocated instance。
编辑:这里我创建了模型字典和它的内容:
self.models = [NSMutableDictionary dictionaryWithCapacity:100];
if (mappings.count > 0)
{
self.groupings = [mappings retain];
for (GroupingInfo *group in self.groupings)
{
NSPointerArray *dataArray = [[NSPointerArray alloc] initWithOptions:NSPointerFunctionsCStringPersonality];
[self.models setValue:dataArray forKey:group.key];
[dataArray release];
}
}
else
{
NSPointerArray *dataArray = [[NSPointerArray alloc] initWithOptions:NSPointerFunctionsCStringPersonality];
[self.models setValue:dataArray forKey:ALLITEMS_GROUP_KEY];
[dataArray release];
}}
EDIT2:只有当我在调试器中单步执行我的dealloc时,我才会得到这个消息,如果我没有单步执行任何事情,我就会看到这个消息(但没有发生崩溃)。
发布于 2013-03-18 15:31:28
我在Apple论坛上听说过:“如果你只在调试程序中单步执行代码时收到该消息,那么这是调试器的一个已知问题。当你单步执行代码以获取对象的描述时,调试器会向对象发送消息。如果一个对象被释放,但仍在作用域内,调试器仍会向释放的对象发送消息,从而导致控制台输出有关发送释放的实例的消息。”所以我希望这是调试器的问题。
https://stackoverflow.com/questions/15416862
复制相似问题