这些问题可能很简单,是的,没有类型的问题。
我有一些包含其他NSDictionaries的NSDictionaries。比方说NSDictionary_A和NSDictionary_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仪器存储为weak或strong可能并不重要,因为NSDictionary_A1中的引用在应用程序生命周期中仍然存在,但是由于它是指针,所以应该是weak - YES。
第二个问题:NSDictionary_B中的 An NSDictionary传递给对象,但它可以更改该NSDictionary中的一些值:
track.playbackType = [NSDictionary_B objectForKey:@"Random"]; [track.playbackType objectForKey:@"maxRange"] = 20;
所以,我应该在这里做一个copy的NSDictionary,因为它的值会被改变,还是我完全误解了整个引用的传递?
发布于 2012-03-26 02:47:09
你被指针的工作方式搞混了。
对于第一个问题,"track.instrument“只是一个指针。因此,它将以“指向零”开头。
这是:
track.instrument = [NSDictionary_A objectForKey:@"Blue"];意思是,“停止指向零并指向该对象”。
如果你能确保你的字典会在整个应用程序中持续存在,那么这并不重要,无论@blue键是什么,都不会被释放。但是为了得到正确的代码,它应该是弱的。
编辑:读错了第二个问题。
第二个问题:
关于这一点:
track.playbackType = [NSDictionary_B objectForKey:@"Random"]; 首先,指针指向字典中的NSDictionary。
[track.playbackType objectForKey:@"maxRange"] = 20;因为它是一个NSDictionary,所以这是无效的。您不能更改NSDictionaries,因为它们是不可变的,所以应该是NSMutableDictionary。
但是,如果您不想将修改后的版本放回原来的字典中,那么您可以先复制它,但作为一个NSMutableDictionary,然后修改它。
NSMutableDictionary *mutableDict = [[NSDictionary_B objectForKey:@"Random"] mutableCopy];
track.playbackType = mutableDict; //Note how track.playbackType has to be NSMutableDictionary aswell.非常重要:,因为您正在创建一个“新”字典。track.playbackType必须是强大的,否则在函数结束和mutableDict超出范围后,它就会立即被释放。
发布于 2012-03-26 02:37:22
引用只是指针,将其设置为0将不会有任何效果,除非在以下情况下:它是最后一个强引用,其他弱引用仍然存在。在这种情况下,所有弱引用都将变为零。强属性将旧值设置为零,实际上发送了一个发布调用,但这会影响引用,而不是引用的内容。
至于第二个问题,这是相当混乱的,我需要更多关于playbackType的信息。您说它是一个NSDictionary,但是NSDictionary没有属性maxRange,所以它必须是您定义的类型。您也不能更改NSDictionary的值,因为它是不可变的。
但是,这里有一个通用的答案:如果您将指向可变对象的指针传递为强(或弱甚至),您将能够更改原始对象的内容。如果将指向可变对象的指针作为副本传递给您,您将得到一个不影响原始对象的新对象。
https://stackoverflow.com/questions/9865912
复制相似问题