2009-05-27 6 views
9

私はObjective-CとCocoaを初めて使っています。私は、NSIntegerとNSNumberはプリミティブな数値型(NSNumberの場合、オブジェクトにラップされている)の "プラットフォームセーフ"なバージョンであるため、単純な整数を扱うときに優先されることを読んでいます。だから、クラス内にNSTimerが起動したときにインクリメントされるカウンタが必要です。 Appleフォーラムでは、同様の状況で誰かに推薦している人々のグループが見つかりました。ヘッダにNSNumberポインタを宣言し、numberWithInt:で初期化してから、インクリメントする必要があるたびに新しいオブジェクト(counter = [NSNumber numberWithInt:[counter intValue]+1];のようなもの)。これは私に過労のように見えます。私が必要としているのはintカウンタです(そして、btw、それはヒットした後に0にリセットされるので、サイズは問題ではありません)、intを使うだけではなく、私のタイマーのループの各反復で新しいオブジェクト?インスタンスレベルカウンタのNSNumberの過剰使用ですか?

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

+0

あなたの2番目の質問に:同じですが、@propertyと@synthesizeを使用してください。 –

答えて

15

NSNumberをシンプルなカウンターに使用すると、オーバーキルが少し見えます。あなたはNSIntegerとして、クラスのメンバを宣言し、単に例えば++または+ =

を使用してそれらを更新することができます。

@interface YourViewController : UIViewController { 
NSInteger counter;  
} 

@property (nonatomic,assign) NSInteger counter; 

@synthesizeだけである:

@synthesize counter 

とのいずれかによってインクリメントすることができます:

self.counter += 1; 

または

counter ++; 

以降では、どのようなオブザーバーにも通知されないため、好ましくない可能性があります。

+0

私は+ =プロパティで働いていたことを知らなかった... @gsのおかげで –

9

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

あなたの例では、カウンタが必要ですが、おそらく過剰です。

NSIntegerは、32ビットおよび64ビットプログラムで安全であるようにtypedefedされた整数で、intの代わりにAppleが推奨しています。それはオブジェクトではありません。これはおそらくカウンタ(実際にはNSUInteger、unsigned int)に必要なものです。

プリミティブをクラス全体で使用できるようにするには、ヘッダーにiVarとして宣言すると、どのクラスでも使用できます。 と@synthesizeは、KVC/KVO準拠の方法でクラス外で見られる(おそらくは変更される)プロパティとしてこれらを宣言するObjective-C 2.0の方法です。プリミティブ型は同じ@property@synthesizeの構文を使用してプロパティとして使用できます。

4

私は(もっと移植できるように、int型ではない)NSIntegerを使用して、私は(このようなアプリケーションを終了するに状態を保存NSMutableDictionaryなど)のコレクションに追加する必要がある場合NSNumberにそれを包みます。

1

私はあなたの本能に賛成です。単純なカウンターのオブジェクトを使用して、過剰な音がして、簡単にカウンターをインクリメントするために不必要なメッセージディスパッチコールを追加します。コレクションに格納する必要がない、またはオブジェクトとして操作する必要のないカウンタの場合は、Cスカラー型を使用します。

ちょうどあなたのヘッダファイルでそれを宣言し、クラスのインスタンス変数としてスカラを宣言する:

@interface MyClass: NSObject{ 
    int counter; 
} 

@end 
0

あなたは(そのようNSManagedObjectのプロパティのような)のNSNumberをインクリメントする必要性を行う場合I

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

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

ので、あなたにインクリメント文を簡素化することができます:

counter = [counter increment]; 
このカテゴリには、助けました
関連する問題