4

私はObjective-Cが初めてです。私は C と C++ を知っていますが、Objective-C にはかなりの学習曲線があります。とにかく、次のように書くためのより短い方法はありますか(おそらく何らかの NSNumber リテラルが存在する場合)。

[Tyler setArms:[[[NSNumber alloc] autorelease] initWithInt:1]];
4

5 に答える 5

17

Clang v3.1の時点で、Objective-C リテラルを使用できるようになりました。

NSNumber *fortyTwo = @42;             // equivalent to [NSNumber numberWithInt:42]
NSNumber *fortyTwoUnsigned = @42U;    // equivalent to [NSNumber numberWithUnsignedInt:42U]
NSNumber *fortyTwoLong = @42L;        // equivalent to [NSNumber numberWithLong:42L]
NSNumber *fortyTwoLongLong = @42LL;   // equivalent to [NSNumber numberWithLongLong:42LL]

だから、あなたの特定の質問に答える:

[Tyler setArms:[[[NSNumber alloc] autorelease] initWithInt:1]];

次のように記述できるようになりました。

[Tyler setArms:@1];

配列と辞書のリテラルもありますが、この質問の範囲外です。

Xcode でリテラルを利用するには、少なくともバージョン 4.4 が必要です (執筆時点ではプレビューのみです)。

注: LLVM はオープン ソース プロジェクトであるため、Apple の NDA の対象にはなりません。

于 2012-06-20T13:12:17.357 に答える
6

はい、次のような多くのヘルパー関数のいずれかを使用してnumberWithInt:ください。

[Tyler setArms:[NSNumber numberWithInt:1]];

[NSNumber numberWithInt:1]は と同等で[[[NSNumber alloc] initWithInt:1] autorelease]、これは と同等[[[NSNumber alloc] autorelease] initWithInt:1]です。後者の表現は非常にまれです。

于 2011-03-21T04:22:09.693 に答える
3

割り当てて初期化する必要はありません。NSNumberそれを行うための便利なメソッドを提供します。

[Tyler setArms:[NSNumber numberWithInt:1]];
于 2011-03-21T04:23:22.087 に答える
3

Xcode 4.4 では、NSNumber リテラルが追加されました。

  // integral literals.
  NSNumber *fortyTwo = @42;             // equivalent to [NSNumber numberWithInt:42]
  NSNumber *fortyTwoUnsigned = @42U;    // equivalent to [NSNumber numberWithUnsignedInt:42U]
  NSNumber *fortyTwoLong = @42L;        // equivalent to [NSNumber numberWithLong:42L]
  NSNumber *fortyTwoLongLong = @42LL;   // equivalent to [NSNumber numberWithLongLong:42LL]

  // floating point literals.
  NSNumber *piFloat = @3.141592654F;    // equivalent to [NSNumber numberWithFloat:3.141592654F]
  NSNumber *piDouble = @3.1415926535;   // equivalent to [NSNumber numberWithDouble:3.1415926535]

  // BOOL literals.
  NSNumber *yesNumber = @YES;           // equivalent to [NSNumber numberWithBool:YES]
  NSNumber *noNumber = @NO;             // equivalent to [NSNumber numberWithBool:NO]

これまでに見た中で最も優れたドキュメントはllvm man pageにあります。

于 2012-07-27T17:04:26.317 に答える
2

前の回答に加えて 2 つの点があり、どちらも正しいです。

まず、Cocoa の命名規則に従うと、サポートが容易になります。オブジェクト ポインターを含む変数は、小文字で開始する必要があります。つまり、「タイラー」ではなく「タイラー」です。クラスと型は大文字で始まります。

第二に、オブジェクトを初期化する前に自動解放することはありません。常に最初に確保し、次に初期化してから、解放や自動解放など、必要なことをすべて実行してください。

于 2011-03-21T04:25:12.243 に答える