1

我正在尝试初始化一个 dict 变量,但我不明白为什么一种方法有效,而另一种方法无效。

如果 1 一切正常,我可以稍后使用 dict 。
在情况 2 中,它很快就会被释放(它会变成僵尸),如果我稍后尝试使用它(在块外),程序就会崩溃。

这是我为 ios 编写的课程中的一些代码(c++ 与 Objective-c 混合)。
在块内,我尝试以两种不同的方式初始化变量 dict 。

class Data
{
public:
    NSMutableDictionary *dict;

    void DoSomeStuff()
    {
    [NSSomeFrameworkTool doSomeStuffWithCompletionHandler:^(NSError *err) {
        // case 1 - OK
        dict = [[NSMutableDictionary alloc] initWithDictionary:[NSKeyedUnarchiver unarchiveObjectWithFile:@"dict.dat"]];

        // case 2 - will crash later if i try to use dict
        dict = [NSKeyedUnarchiver unarchiveObjectWithFile:@"dict.dat"];   }];
    }
}

这个类有类变量 dict,它在 DoSomeStuff() 方法中被初始化。
该方法从 ios 框架中调用一个方法,该方法使用块(作为回调)来通知我某些任务已完成。

我想知道为什么案例 1 和案例 2 的工作方式不同。也许禁止在块外使用在该块内初始化的引用?
按照 case2 所示的方式执行此操作有什么问题?

4

2 回答 2

2

在第一种情况下,您不释放您的 dict,而在第二种情况下,它是自动释放的,因此您应该保留它。

dict = [[NSKeyedUnarchiver unarchiveObjectWithFile:@"dict.dat"] retain];
于 2011-12-19T15:53:47.830 回答
2

我认为您可以在这里使用块变量。

__block NSMutableDictionary *dict;

变量在块内是不可变的。它们是一个常量副本,是“创建块”时变量的快照,因此不能在块内修改。块变量会将变量从“堆栈”移动到“堆”,允许您更改它的状态。我绝不是块方面的专家,因为它们对 Objective c 来说相对较新。但是如果你在谷歌周围学习的话,会有一些很好的文章。

http://pragmaticstudio.com/blog/2010/7/28/ios4-blocks-1

于 2011-12-19T16:27:41.397 回答