0

私の配列:

NSMutableArray *squareLocations;

CGPoint dotOne = CGPointMake(1, 1);
[squareLocations addObject:[NSValue valueWithCGPoint:dotOne]];

CGPoint dotTwo = CGPointMake(10, 10);
[squareLocations addObject:[NSValue valueWithCGPoint:dotTwo]];

CGPoint dotThree = CGPointMake(100, 100);
[squareLocations addObject:[NSValue valueWithCGPoint:dotThree]];

int num = [squareLocations count];

for (int i = 0; i < num; i++)
{
    NSValue *pointLocation = [squareLocations objectAtIndex:i];
    NSLog(@"%@", pointLocation);
}

squareLoctionsオブジェクト カウントを要求すると、0 が返されますか? しかし、カウントを求める直前に、3 つの NSValue オブジェクトを追加しました??? 誰にもアイデアはありますか?

4

2 に答える 2

7

最初に配列を初期化する必要があります

NSMutableArray *squareLocations = [[NSMutableArray alloc] init];
于 2013-03-14T01:40:56.520 に答える
3

0実際には配列のサイズを要求していないため、その配列が返されます。

配列であると想定しているオブジェクトは、割り当てられておらず、正しく初期化されていません。

現在 として初期化されているインスタンスを要求していますnil。興味深いのは、Objective-C ではインスタンスで任意のメソッド (セレクター) を呼び出すことができるため、クラッシュしないことですnil(この用語は正確ではありません)。ただ、これらのnilインスタンスは、戻り値を求められたときに、予想される型に応じて常に0NO0.0f0.0またはを返します。nilつまり、期待される型にキャストされるとゼロに設定される値を常に返します。


この問題を解決するには、変数に an のインスタンスを割り当て、初期化し、割り当てる必要がありNSMutableArrayます。

allocこれは、適切なメソッドとinitメソッドの組み合わせを使用して実行できます。

NSMutableArray *squareLocations = [[NSMutableArray alloc] init];

または、次のような便利なコンストラクターのいずれかを使用できます。

NSMutableArray *squareLocations = [NSMutableArray array];

次にこのような奇妙な動作に遭遇した場合は、問題のインスタンスがnil最初ではないかどうかを確認してください。

于 2013-03-14T01:59:09.757 に答える