2009-05-26 20 views
7

Objective Cで、宣言、プロパティの設定、合成、およびサイズ5のint配列の実装方法を教えてください。私はこのコードをiPhoneアプリ用に書いています。ありがとう。Objective Cのint []配列の宣言、プロパティ、合成、実装

+1

この手順を踏むことができない場合は、実際にCocoaプログラミングに関するAaron Hillegasの本を手に入れる必要があることを心からお勧めします。 – KevinDTimm

+0

私は、NSMutableArrayを使用することで逃げることができ、サイズが5で固定されているので、5つの独立したintを持つことができることを知っていますが、intの配列を持つ方がずっと優雅です。私はまた、将来のためにどのように知りたいのですか?私はいくつかの他の言語で書いてきましたが、私はアイフォーン用の目的のCでそれを行う方法についての決定的な答えを見つけることができないようです。 –

答えて

9

私が行うには、「ココア-Y」の事は、あなたが内部的にそれを使用する場合でも、int配列を隠していると思います。何かのように:

@interface Lottery : NSObject { 
    int numbers[5]; 
} 

- (int)numberAtIndex:(int)index; 
- (void)setNumber:(int)number atIndex:(int)index; 
@end 

@implementation Lottery 

- (int)numberAtIndex:(int)index { 
    if (index > 4) 
     [[NSException exceptionWithName:NSRangeException reason:[NSString stringWithFormat:@"Index %d is out of range", index] userInfo:nil] raise]; 
    return numbers[index]; 
} 

- (void)setNumber:(int)number atIndex:(int)index { 
    if (index > 4) 
     [[NSException exceptionWithName:NSRangeException reason:[NSString stringWithFormat:@"Index %d is out of range", index] userInfo:nil] raise]; 
    numbers[index] = number; 
} 
+0

それは過剰です。 C配列を使用します。 –

+0

どうすればいいですか?私はそれが元々int配列でやっていたことだと思います。 –

+0

*はC配列、Rogerを使用しています。しかし、それは本当にココアのインターフェイスに属していないmemcpyと低レベルの細部のすべての面倒を取り除きます。 – Chuck

0

この場合、配列を使用する場合はintを使用しないでください。 NSNumberを使用し、それらの5つのNSNumberをNSMutableArrayに配置します。

@interface testClass: NSObject { 
    NSMutableArray* numbers; 
} 
@property (nonatomic, retain) NSMutableArray* numbers; 
-(id)initWithValue:(NSNumber *)initialValue; 
@end 


@implementation testClass 
@synthesize numbers; 
-(id)initWithValue:(NSNumber *)initialValue { 
    numbers = [[NSMutableArray alloc] initWithCapacity:5]; 
    [numbers addObject:initialValue]; 
    return self; 
} 
@end 

インターフェイスと実装のコードはsynthesize(テ​​ストされていないBTW)であるかどうか。あなたは何を達成しようとしていますか?

Good quick intro

+0

迅速な対応に感謝します。私がintの配列を使いたい理由は、1:1000の間に5つのランダム/ユニークな数値を格納しようとしていることです。これはNSMutableArrayを使うとはるかに難しいようです。何を指示してるんですか? –

+0

ああ、おそらくforループでintArray [i] == intArray [i-1]が失敗したかどうかをチェックしますか?確かにobjcオブジェクトを使用するとオーバーヘッドが増えますが、int []を使うほうが良いかもしれません。数値を生成するメソッドで整数配列をローカル変数として保持できますか?それとも、クラスのアクセス可能なプロパティである必要がありますか? – ryanday

+0

クラスがMVCのモデルの一部であるため、インスタンス変数にしたいです。しかし、サイズがわずか5であれば余分なオーバーヘッドが大きくなりますか? –

0

私はクラス変数があります。だから私は私のコードでは、通常のミント[1] = 0の構文を使用することができることを

NSInteger myInt[5]; 

を、私は整数のポインタを返すプロパティを作成しました:

-(NSInteger *) myInt { 
    return myInt 
} 
0123:次に

@property (nonatomic, readonly) NSInteger *myInt; 

は、次のgetterメソッドを作成しました

私はclass.myInt [1] = 0のようなものを使うことができます。

これは確かにわかりませんが、そう思われます。私はちょうど誰かがそれを試してみたい場合、私はこれをそこに置くと思った。

2

ここに試してみましょう。 .hファイルで:

@property int* myIntArray; 

その後、.mファイルに:あなたは@synthesizeを使用している場合

@synthesize myIntArray; 

は、あなたが(おそらく初期化時に、配列自身のcalloc/malloc関数する必要があります)。

また、配列が割り当てられる前に呼び出された場合は、独自のアクセサー関数を記述してmalloc/callocを呼び出すこともできます。

いずれにしても、dealloc()メソッドで配列を解放したいと思うでしょう。

私はObjective Cで自分自身を立てているので、これはおそらく素朴で間違っていますが、これまでのところ私のために働いているようです。

+0

+1すばらしい最初の答え! – bakoyaro

0

何をしても、その結果に気づく必要があります。

整数配列は参照カウントされません。どれくらいの人がアクセスしているのか分かりません。それをいつ誰が割り振るべきか分かりません。したがって、int *型のプロパティを簡単に持つことができます。 setterはポインタをとり、それをインスタンス変数に格納します。ゲッターはインスタンス変数の内容を返します。それだけで動作します。

ただし、配列の割り当てまたは割り当て解除をいつ行うべきか分かりません。いくつかの静的配列(例えば、数字を含む4つの異なるテーブル)がある場合は問題ありません。しかし、malloc()で整数の配列を作成する場合は、誰かがfree()しなければなりません。だからこれはいつ起こるのだろうか?

配列の寿命を手作業で処理するのはゴミであるため、NSNumberのNSArrayを使うか、NSPointerArrayを参照することをお勧めします。前回の回答では、宝くじクラスのような独自のクラスを作成しました。ちょっと柔軟性があります。

関連する問題