2011-07-03 11 views
0

私はiPhoneアプリを開発しています。NSMutableArrayの内容を確認する

私は、次のINITコードがあります。その後

shapes = [NSMutableArray arrayWithCapacity:numShapes]; 

を、私は次の操作を実行したい:

- (CGSize) sizeOfShapeType:(ShapeType)type{ 
    CGSize shapeSize = CGSizeMake(0, 0); 
    if (shapes != nil) { 
     for(Object2D* obj in shapes) 
      if (obj.figure == type) { 
       shapeSize = obj.size; 
       break; 
      } 
    } 
    return (shapeSize); 
} 

しかし、私はいつも形状内のすべての図形のでEXEC_BAD_ACCESSを取得配列はnullです。

Object2Dがnullであるかどうかを確認するにはどうすればよいですか?

私はここで例外を取得:あなたはそれが途中で割り当て解除取得することはできませんを確認するために、それを保持しなければならないので、

for(Object2D* obj in shapes) 

答えて

5

arrayWithCapacityは、自動解放オブジェクトを返します。

shapes = [[NSMutableArray alloc] initWithCapacity:numShapes]; 

または

// .h file 
@property (nonatomic, retain) NSMutableArray *shapes; 
// .m file 
@synthesize shapes; 
// your init method 
self.shapes = [NSMutableArray arrayWithCapacity:numShapes]; 

後者のソリューションでは、図形ivarの属性をretain属性で宣言する必要があります。

1

EXC_BAD_ACCESSを取得した理由は、おそらくshapes変数に割り当てられたオブジェクトの所有権を主張せず、NSMutableArrayの問題ではないと考えられます。私はshapesがインスタンス変数であると仮定しています。 sizeOfShapeTypeが呼び出されるまでには、shapesに格納されたオブジェクトが解放されています。

したがって、解決策は所有権を主張することです。

shapes = [[NSMutableArray arrayWithCapacity:numShapes] retain]; 
// or 
shapes = [[NSMutableArray alloc] initWithCapacity:numShapes]; 
0
shapes = [NSMutableArray arrayWithCapacity:numShapes]; 

あなたが実際に作成し、Object2Dオブジェクトを配列にロードされたことがありますか?上記の配列の初期化は、オブジェクトへのポインターの数をnumShapesのスペースで配列を初期化します。しかし、配列は依然として効果的に空になります。あなたのためにObject2Dオブジェクトは作成されません。

私は明白なことを言っています。しかし、それがあなたのinitコードでやっていることならば、arrayWithCapacity:が何を意味するのか誤解しています。

関連する問題