9

Objective-C と Cocoa は初めてです。NSInteger と NSNumber は、プリミティブ数値型の「プラットフォームセーフ」バージョンであるため (NSNumber の場合はオブジェクトにラップされているため)、単純な整数を操作する場合に推奨されることを読みました。したがって、クラスには、NSTimer が発生したときにインクリメントされるカウンターが必要です。Apple フォーラムで、同様の状況にある人に、ヘッダーで NSNumber ポインターを宣言し、numberWithInt: で初期化することを推奨している人々のグループを見つけました。新しいオブジェクト (次のようなものcounter = [NSNumber numberWithInt:[counter intValue]+1];)。これは私にはやり過ぎに見えます。必要なのは int カウンターだけの場合 (そして、サイズが問題にならないので、15 に達した後は 0 にリセットします)、int を使用するだけで済みません。タイマーのループを繰り返すたびに新しいオブジェクトを作成しますか?

もしそうなら、クラス全体でプリミティブ型を利用できるようにするにはどうすればよいですか。オブジェクト型では、インターフェイスで宣言し、@property と @synthesize を使用することを知っています...プリミティブを操作するときに同等のもの (存在する場合) は何ですか?

4

5 に答える 5

15

単純なカウンターに NSNumber を使用するのは、少し過剰に見えます。クラス メンバーを NSInteger として宣言し、++ または += を使用して単純に更新できます。

例えば:

@interface YourViewController : UIViewController  {
NSInteger counter;      
}

@property (nonatomic,assign) NSInteger counter;

@synthesize は次のとおりです。

@synthesize counter

次のいずれかによってインクリメントできます。

self.counter += 1;

また

counter ++;

後者は、オブザーバーに通知されないようにするため、好ましくない場合があります。

于 2009-05-27T12:17:08.567 に答える
9

NSNumber は数値のオブジェクト表現です。オブジェクト ポインターしか保持できないため、コレクション クラスに数値を格納するときに使用します。

したがって、カウンターが必要なあなたの例では、おそらくやり過ぎです。

NSInteger は、32 ビットおよび 64 ビット プログラムで安全であると型定義された単純な整数であり、int. これはオブジェクトではありません。これはおそらくカウンターに必要なものです(実際にはNSUIntegerであり、これはunsigned intより良いかもしれません)。

クラス全体でプリミティブを使用できるようにすることについては、ヘッダーで iVar として宣言すると、とにかくクラス全体で使用できます。@propertyこれらは、KVC/KVO 準拠の方法でクラスの外部で表示 (および@synthesizeおそらく変更) できるプロパティとしてこれらを宣言する目的の C 2.0 の方法にすぎません。@propertyプリミティブ型は、同じand@synthesize構文を使用してプロパティとして使用できます。

于 2009-05-27T12:21:32.520 に答える
4

NSInteger(移植性を高めるために int ではなく)を使用NSNumberし、コレクションに追加する必要がある場合は (NSMutableDictionaryアプリケーションの終了時に状態を保存する場合など) にラップします。

于 2009-05-27T12:23:21.300 に答える
1

私はあなたの本能に同意します。単純なカウンターにオブジェクトを使用するとやり過ぎに聞こえ、単にカウンターをインクリメントするための不要な数のメッセージディスパッチ呼び出しが追加されます。コレクションに格納したり、オブジェクトとして操作したりする必要のないカウンターの場合は、C スカラー型を使用してください。

スカラーをクラスのインスタンス変数として宣言するには、ヘッダー ファイルで宣言するだけです。

@interface MyClass: NSObject{
  int counter;
}

@end
于 2009-05-27T12:24:53.480 に答える
0

NSNumber をインクリメントする必要がある場合(NSManagedObject プロパティなど)、次のカテゴリが役立つことがわかりました。

@interface NSNumber (Incrementer)
- (NSNumber *)increment;
@end

@implementation NSNumber (Incrementer)
- (NSNumber *)increment {
    return [NSNumber numberWithInt:[self intValue]+1];
}
@end

したがって、インクリメント ステートメントを次のように簡略化できます。

counter = [counter increment];
于 2010-08-16T12:58:08.877 に答える