什么是使用保留类型的NSMutableSet的属性与副本的语义;
-
26-09-2019 - |
题
我已经使用最优异的Accessorizer到自动生成神奇制定者/用于在Xcode我的OBJ-C代码吸气剂。最近的变化是在Accessorizer制备:
旧版本Accessorizer的:结果 @属性(非原子,保留)的NSMutableSet *组A;结果 @属性(非原子,保留)的NSMutableSet *组B;
Accessorizer的新版本:结果 @属性(非原子,副本)的NSMutableSet *组A;结果 @属性(非原子,复制)的NSMutableSet *组B;
不幸的是,新版本崩溃我的代码。在我的代码我做到以下几点:
self.setA = [[[NSMutableSet alloc] init] autorelease];
self.setB = [[[NSMutableSet alloc] init] autorelease];
// ...
[self.setA minusSet:self.setB];
上面的代码线的工作原理使用旧的方式(保留)良好,但使用新的方法(复制)崩溃。显然,什么是错在这里。我靠Accessorizer广泛。可能有人请澄清使用复制的影响中的NSMutableSet的背景下/挽留?
谢谢,结果 道格
解决方案
如果你是属性类型是一个的可变的设置,您很可能希望保留。如果它是一个的非可变的集(又名NSSet中),苹果的指导方针说要使用复制,而不是保留。
的区别是,有一个期望,一个可变集都不会改变。非可变组预计将保持不变,但如果它的声明为保留,有人可以将其设置为一个可变的集合,然后意外更改的内容。
其他提示
是,这是属性的“特征”。当您设置被声明为copy
的属性,然后将生成的二传是要调用对象的-copy
。不幸的是,在可变对象的情况下,这导致一个不可变变体
在换句话说,通过[myMutableSet copy]
返回的对象是的不强>可变
如果您需要设定为可变的,则你的必须使用retain
(或重写设定器使用mutableCopy
代替copy
)。
我日提交的错误在这(rdar:// 8416047),但它被关闭为“作品设计的”。 (因为有确实没有办法的setter知道如果一个对象是可变的或不)