首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSPointerArray和char *的内存管理问题

NSPointerArray和char *的内存管理问题
EN

Stack Overflow用户
提问于 2013-03-15 02:02:45
回答 1查看 435关注 0票数 1

我有一个char *,我用strtok处理它,并得到我用strdup得到的每一行代码的副本。此char *用作函数的参数,该函数将指针存储在保存NSPointerArray实例的NSMutableArray中。问题是,当我在dealloc中调用NSMutableDictionary上的release时,我得到了消息发送到已释放实例`的消息。所以我认为这里有一些可怕的错误…下面是一些代码:

代码语言:javascript
复制
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如下所示:

代码语言:javascript
复制
-(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被调用:

代码语言:javascript
复制
-(void)dealloc
{    
    [_models release];
    [_type release];
    [super dealloc];
}

对于我的_models字典中的每个条目,我都会得到消息message send to deallocated instance

编辑:这里我创建了模型字典和它的内容:

代码语言:javascript
复制
    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时,我才会得到这个消息,如果我没有单步执行任何事情,我就会看到这个消息(但没有发生崩溃)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-18 15:31:28

我在Apple论坛上听说过:“如果你只在调试程序中单步执行代码时收到该消息,那么这是调试器的一个已知问题。当你单步执行代码以获取对象的描述时,调试器会向对象发送消息。如果一个对象被释放,但仍在作用域内,调试器仍会向释放的对象发送消息,从而导致控制台输出有关发送释放的实例的消息。”所以我希望这是调试器的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15416862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档