我已经使用最优异的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知道如果一个对象是可变的或不)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top