Scenario1:
NSDictionary *dictionary =
[[NSDictionary alloc] initWithContentsOfFile:plistPath];
self.stateZips = dictionary;
[dictionary release];
Scenario2:
self.stateZips = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
答案 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的保留/释放规则是非常困难的。