这些可能是非常简单的YES|NO类型的问题。
我有一些包含其他NSDictionary的NSDictionaries。比方说NSDictionary_A和NSFDictionary_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
仪器存储为weak
或strong
可能无关紧要,因为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的值,因为它是不可变的。
但这里有一个通用的答案:如果您将指向强(甚至弱)可变对象的指针传递给它,您将能够更改原始对象的内容。如果将指向可变对象的指针作为副本传递,则会得到一个不影响原始对象的新对象。