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
为啥 NSDictionary 在使用 dictionaryWithObjectsAndKeys 时有时会删除引号?
为啥我得到“[__NSArrayI allKeys]:无法识别的选择器发送到实例”/为啥 NSDictionary 正在转换?
为啥我得到“[__NSArrayI allKeys]:无法识别的选择器发送到实例”/为啥 NSDictionary 正在转换?