首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSDictionary + ARC +复制与参考

NSDictionary + ARC +复制与参考
EN

Stack Overflow用户
提问于 2012-03-26 02:26:52
回答 2查看 1.7K关注 0票数 0

这些问题可能很简单,是的,没有类型的问题。

我有一些包含其他NSDictionaries的NSDictionaries。比方说NSDictionary_ANSDictionary_B.这些都会在应用程序的生命中持续存在。

NSDictionary_A中包含的NSDictionaries通过引用各种对象传递:

track.instrument = [NSDictionary_A objectForKey:@"Blue"];

后来,它被改变了:

track.instrument = [NSDictionary_A objectForKey:@"Red"];

所以第一个问题:-- @property仪器被合成+保留为strong --instrument设置器在设置新值之前是否将instrument的当前值设置为nil,如果是,这是否影响NSDictionary_A中引用的来源--换句话说,将引用设置为nil'?写出来听起来不对..。所以我认为答案是,NO,。此外,@property仪器存储为weakstrong可能并不重要,因为NSDictionary_A1中的引用在应用程序生命周期中仍然存在,但是由于它是指针,所以应该是weak - YES

第二个问题:NSDictionary_B中的 An NSDictionary传递给对象,但它可以更改该NSDictionary中的一些值:

track.playbackType = [NSDictionary_B objectForKey:@"Random"]; [track.playbackType objectForKey:@"maxRange"] = 20

所以,我应该在这里做一个copy的NSDictionary,因为它的值会被改变,还是我完全误解了整个引用的传递?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-26 02:47:09

你被指针的工作方式搞混了。

对于第一个问题,"track.instrument“只是一个指针。因此,它将以“指向零”开头。

这是:

代码语言:javascript
复制
track.instrument = [NSDictionary_A objectForKey:@"Blue"];

意思是,“停止指向零并指向该对象”。

如果你能确保你的字典会在整个应用程序中持续存在,那么这并不重要,无论@blue键是什么,都不会被释放。但是为了得到正确的代码,它应该是弱的。

编辑:读错了第二个问题。

第二个问题:

关于这一点:

代码语言:javascript
复制
track.playbackType = [NSDictionary_B objectForKey:@"Random"]; 

首先,指针指向字典中的NSDictionary

代码语言:javascript
复制
[track.playbackType objectForKey:@"maxRange"] = 20;

因为它是一个NSDictionary,所以这是无效的。您不能更改NSDictionaries,因为它们是不可变的,所以应该是NSMutableDictionary。

但是,如果您不想将修改后的版本放回原来的字典中,那么您可以先复制它,但作为一个NSMutableDictionary,然后修改它。

代码语言:javascript
复制
NSMutableDictionary *mutableDict = [[NSDictionary_B objectForKey:@"Random"] mutableCopy];

track.playbackType = mutableDict; //Note how track.playbackType has to be NSMutableDictionary aswell.

非常重要:,因为您正在创建一个“新”字典。track.playbackType必须是强大的,否则在函数结束和mutableDict超出范围后,它就会立即被释放。

票数 1
EN

Stack Overflow用户

发布于 2012-03-26 02:37:22

引用只是指针,将其设置为0将不会有任何效果,除非在以下情况下:它是最后一个强引用,其他弱引用仍然存在。在这种情况下,所有弱引用都将变为零。强属性将旧值设置为零,实际上发送了一个发布调用,但这会影响引用,而不是引用的内容。

至于第二个问题,这是相当混乱的,我需要更多关于playbackType的信息。您说它是一个NSDictionary,但是NSDictionary没有属性maxRange,所以它必须是您定义的类型。您也不能更改NSDictionary的值,因为它是不可变的。

但是,这里有一个通用的答案:如果您将指向可变对象的指针传递为强(或弱甚至),您将能够更改原始对象的内容。如果将指向可变对象的指针作为副本传递给您,您将得到一个不影响原始对象的新对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9865912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档