1

そのため、この1時間ほどコードとの戦いに費やしましたが、最終的に、使用しようとしていたNSSetが空であることがわかりました。コードの最初の行から2番目の行に切り替えると、すべてがうまく機能しました。私は誰かが最初の行の何が悪いのか教えてくれることを望んでいました。それはうまくコンパイルされますが、どうやら私が望んでいることをしません。

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

vs

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 に答える