两个代码场景之间有什么区别

时间:2011-08-04 02:39:33

标签: objective-c memory-management

Scenario1:

NSDictionary *dictionary =
              [[NSDictionary alloc] initWithContentsOfFile:plistPath];
self.stateZips = dictionary;
[dictionary release];

Scenario2:

self.stateZips = [[NSDictionary alloc] initWithContentsOfFile:plistPath];

3 个答案:

答案 0 :(得分:4)

依赖stateZips属性。
如果是retained
场景1:stateZips被正确保留(stateZips上的版本将调用其dealloc)。当地和那里也会发布当地字典 场景2:stateZips保留两次(stateZips中的版本不会调用其dealloc,因为它仍然保留)。

如果是assigned
场景1:stateZips指向已发布的字典并访问其他可能导致崩溃的字典 场景2:stateZips被正确保留(stateZips上的版本将调用其dealloc)。

copy没有被考虑,因为我认为它不是你的意图(至少在这段代码中)

答案 1 :(得分:1)

两者都将self.stateZips设置为使用plistPath中指向的文件初始化的字典。

但是在第二个中,没有保存指向初始化字典的指针,因为它是一个保留计数为+1的对象,技术上需要在某个地方发送release消息,以平衡内存管理。但由于无法检索指向该对象的指针,因此最终会导致内存泄漏。

有两个例外:

1.Garbage Collection
如果你在垃圾收集环境中,两者都是一样的。嗯,它们不一样,但结果是相似的。

2.Property type
如果stateZips的setter只是指定指针,那么你可以使用ivar指针释放对象。然后这两段代码只有一个区别:在前者中,对象在使用后立即释放。在后者中,它只是“未定义”。如果没有上下文,很难确定此对象是否已发布,以及何时发布。

答案 2 :(得分:0)

我假设stateZips是具有retain属性的属性。

在场景1中。在第一行中创建一个保留计数为1的字典。在第二行中,属性将再次调用retain,将保留计数增加到2.最后保留计数按释放递减。这将使字典保留正确的保留计数。

在场景2中,保留仅被调用一次。

两种情景的净效果是相同的。将保留字典对象,您需要在类的dealloc方法中包含一个发行版。

如果编译器没有正确处理,那么确实遵循objective-c的保留/释放规则是非常困难的。