1

所以我花了最后一个小时左右与我的代码作斗争,最终发现我试图使用的 NSSet 是空的。一旦我从第一行代码切换到第二行,一切都很好。我只是希望有人能告诉我第一行有什么问题。它编译得很好,但显然没有做我希望的事情。

NSSet *singleOperandOperations = [singleOperandOperations initWithObjects: @"cos", @"sin", @"sqrt", nil];

对比

NSSet *singleOperandOperations = [NSSet setWithObjects: @"cos", @"sin", @"sqrt", nil];

谢谢!

4

3 回答 3

4

setWithObjects:是一个所谓的便利构造函数,它实际上是先做一个alloc然后再做一个initWithObjects:setWithObjects:只是少了一点打字。请注意,按照惯例id,这种便利构造函数的返回值是autorelease'd。

所以你的第一个例子应该是:

NSSet *singleOperandOperations = [[NSSet alloc] initWithObjects: etc...];

这可以替换为:

NSSet *singleOperandOperations = [NSSet setWithObjects: etc...];
于 2012-03-05T18:37:09.603 回答
1

我不是 100% 确定,但我相信你应该alloc这样做。这就是我要做的:

NSSet *singleOperandOperations = [[NSSet alloc]initWithObjects: @"cos", @"sin", @"sqrt", nil];

那可行。你的另一条线也可以。区别仅在于您必须输入的字符数;)

希望能帮助到你

于 2012-03-05T18:38:05.657 回答
0

好吧,您的第一个示例缺少分配。但通常调用 alloc/init 会分配一个您拥有的对象,而便捷的构造函数 setWithObjects 返回一个自动释放的对象。

于 2012-03-05T18:36:16.017 回答