web-dev-qa-db-ja.com

Objective-Cでオブジェクトの配列を作成します。

2週間ほどXCodeをいじり、MVCについて少し読んでいます。モデルをコントローラーに接続しようとすると問題が発生します。アレイに頭を悩ませるのが難しいからです。 Javaでプログラミングしたときに単純な配列を処理できますが、Obj-C NSArraysに脅かされています。

誰かがオブジェクトの配列に対する簡単な呼び出しを私に見せてくれるなら、私は永遠に感謝します。

私のモデル:

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject 
{
NSString *name;
NSNumber *age;
}

@property(nonatomic, retain) NSString *name;
@property(nonatomic, retain) NSNumber *age;

@end

Person.m

#import "Person.h"
@implementation Person
@synthesize name;
@synthesize age;
@end

私が試して学習している間、私は非常に簡単な場合は続けました。

コントローラークラスになりました。私がやりたいのは、40個の「Person」オブジェクトの配列を作成することです。しかし、私はそれをObj Cのコードに入れる正しい方法を知りません。

Controller.h

#import <Foundation/Foundation.h>
@class Person;
@interface Controller : NSObject 
{
Person *person;
}
@property(nonatomic, retain) Person *person;

-(void) doSomeWork;

@end

Controller.m

#import "Controller.h"
#import "Person.h"

@implementation Controller

@synthesize person;


-(IBAction)doSomeWork
{
// I guess here is where i should create my array of 40 person objects
}

@end

私の問題は、サイズ40の人物オブジェクトの配列をどのように宣言するかです。次に、配列にアクセスして読み書きする方法です。

私の投稿を読んでくれてありがとう。

20
user440096

ControllerクラスにNSMutableArrayインスタンス変数を作成し、doSomeWorkを呼び出すたびにPersonオブジェクトをその配列に追加する例を次に示します。

@interface Controller

NSMutableArray *personArray;

@end
@implementation Controller

- (void) viewDidLoad {
    ................
    NSMutableArray *personsArray = [[NSMutableArray alloc] initWithCapacity:40];
}

- (IBAction)doSomeWork {
    Person *myPerson = [[Person alloc] init];
    myPerson.name = name;
    myPerson.age = age;

    [personsArray addObject:myPerson];
}
@end
29
ennuikiller

Cocoa/CocoaTouchを備えたObjective-Cの配列は、Javaとはまったく異なります。 3つの主な違いは次のとおりです。

  1. Obj-C配列は、他のクラスと同様の単なるクラスであり、言語の組み込みサポートはありません。 Javaでは、配列には[]演算子を介した言語の組み込みサポートがあります。

  2. Obj-C配列は型指定されておらず、NSObjectから継承するオブジェクトを受け取ります。これは、同じ配列内で型を混在させることができることを意味しますが、非常に適切な理由がない限り、これはおそらく悪い習慣です。 (intdoublecharBOOL、およびその他の組み込み型はNSObjectから継承しないことに注意してください。したがって、それらを配列に保持する場合は、NSNumberオブジェクトでラップする必要があります。)

  3. Obj-C配列は、配列全体が不変でない限り、実際には固定長の概念を持ちません。したがって、配列を作成するときに長さを決める必要はありません。

可変配列、つまりオブジェクトの変更(およびオブジェクトの追加と削除、配列の長さの変更)を許可する配列を作成するには、NSMutableArrayを作成します。

myArray = [[NSMutableArray alloc] init];
// Could also use initWithCapacity: 40, but not necessary.

Personのインスタンスなどのオブジェクトを追加するには、addObject:メソッドを呼び出して、すぐに新しいPersonを作成するか、既存のオブジェクトへのポインターを与えます。

[myArray addObject: [[[Person alloc] init] autorelease]];
[myArray addObject: someOtherPerson];
// Last line adds some other person I already had a pointer to.

オブジェクトを削除するには、removeObjectAtIndex:またはremoveLastObjectを使用できます。置き換えるには、replaceObjectAtIndex:withObject:を呼び出します。配列の中央にオブジェクトを挿入するには(そして、これにより配列のサイズも大きくなります)、insertObject:atIndex:を呼び出します。

これは、最も重要なmutatingメソッド、つまりNSMutableArrayに固有のメソッドを対象としています。もちろん、配列のみを監視するメソッドもあり、それらはNSArrayで定義されています。最も重要なのは、現在の要素数を与えるcountと、指定したインデックスにあるオブジェクトを与えるobjectAtIndex:です。

配列にPersonオブジェクトがある場合、次のようにそれらを反復処理できます。

for (int i = 0; i < [myArray count]; i++) {
    Person* p = [myArray objectAtIndex: i];
    // Do something with p 
}

追加できない場合は、NSArrayをどのように作成するのか疑問に思うかもしれません。まあ、そのコンストラクタの1つはinitWithObjects:です。これにより、追加するオブジェクトのコンマ区切りリストを記述できます(そして、nil値で終了する必要があります)。もう1つはinitWithArray:です。これにより、別の配列(変更可能)を渡すことができ、コンストラクターは、新しい配列を作成するときに、提供された配列のオブジェクトを使用します。

51
harms