NSDictionary+ARC+复制与参考



这些可能是非常简单的YES|NO类型的问题。

我有一些包含其他NSDictionary的NSDictionaries。比方说NSDictionary_ANSFDictionary_B。这些将在应用程序的生命周期中持续存在。

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

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

稍后更改:

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

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

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

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

那么,我应该在这里制作NSDictionary的copy,因为它的值将被更改,还是我完全误解了传递thang的整个引用?

您对指针的工作方式感到困惑。

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

这个:

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

意思是,"停止指向零并指向该对象"

如果你能确保你的字典在整个应用程序中都能使用,那么没关系,@bluekey中的任何东西都不会被处理掉。但是为了拥有正确的代码,它应该是弱的。

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

第二个问题:

关于这个:

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

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

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

由于它是NSDictionary,因此无效。您不能更改NSDictionary,因为它们是不可变的,它应该是NSMutableDictionary。

但是,如果你不想把修改后的版本放回原始词典中,那么你可以先把它复制成NSMutableDictionary,然后再更改它。

NSMutableDictionary *mutableDict = [[NSDictionary_B objectForKey:@"Random"] mutableCopy];
track.playbackType = mutableDict; //Note how track.playbackType has to be NSMutableDictionary aswell.

非常重要:因为您正在创建一个"新"字典track.playbackType必须是strong,否则它将在函数结束后立即被释放,并且mutableDict超出范围。

引用只是指针,除非在以下情况下,否则将1设置为零将无效:它是最后一个强引用,其他弱引用仍然存在。在这种情况下,所有弱引用都将变为零。强属性会将旧值设置为零,实际上会发送一个释放调用,但这会影响引用的REFERENCE,而不是引用的CONTENT。

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

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

最新更新