NSDictionary,这是为啥

Posted

技术标签:

【中文标题】NSDictionary,这是为啥【英文标题】:NSDictionary, why is thisNSDictionary,这是为什么 【发布时间】:2010-11-14 11:22:50 【问题描述】:

我正在学习这个行业,目前专注于 NSDictionary。我目前正在做“Beginning iPhone Development Exploring the iPhone SDK”一书中的示例(Dave Mark / jeff LaMarche)。

我正在处理的示例在第 7 章(第 166 页),标签栏和选择器。

我想问一下他们为什么会这样使用字典。

这是场景:

在 .h 文件中:

NSDictionary *stateZips;

.m 文件(viewDidLoad)它们有如下代码:

NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath]; self.stateZips = 字典; [词典发布];

我的问题是,是否有任何特定的 Objective-C 原因将字典复制到 stateZips 而不是使用 stateZips 从 plist 初始化以避免额外的代码? ...或者如果这只是作者自己的做事方式?

【问题讨论】:

你知道你可以接受答案,对吧? 第二。接受正确答案是正确的礼仪。 【参考方案1】:

.m 文件是否也有 stateZips 的 @synthesize 语句?我猜它有,因为分配的风格。

如果有一个带有retain 的属性声明,以及一个stateZips 的@synthesize 语句并且你这样做:

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

您将遇到内存泄漏。在上面的语句中创建的字典在语句之后的保留计数为 2。一个为 alloc 保留,一个由合成的 setter 执行。

这是使用包含保留语句的设置器的副作用,但是如果您不使用带有保留语句的设置器,您可能会遇到更大的内存管理问题... ;-)

为了更好地理解这些内容,您应该研究@property 的分配和保留的使用以及合成的setter 和getter 背后的代码。

【讨论】:

【参考方案2】:

因为我认为 stateZips 是一个可以保留的属性。 因此,当他们 alloc/initWithContentsOfFile 字典时,他们需要释放它,因为 self.stateZips 已经保留了它。

【讨论】:

正确,尽管我看不出他们为此使用 setter 的原因(它没有任何帮助,只是将性能用于方法查找)...

以上是关于NSDictionary,这是为啥的主要内容,如果未能解决你的问题,请参考以下文章

从 NSDictionary 转换为 [String:Any?]

带有 JSON 格式字符串的文件,如何将文件内容读入 NSDictionary

如何设置 twilio 通话记录?

为啥 NSDictionary 在使用 dictionaryWithObjectsAndKeys 时有时会删除引号?

为啥我得到“[__NSArrayI allKeys]:无法识别的选择器发送到实例”/为啥 NSDictionary 正在转换?

为啥我得到“[__NSArrayI allKeys]:无法识别的选择器发送到实例”/为啥 NSDictionary 正在转换?