2

このコードを使用して NSMutableArray にオブジェクトを割り当てようとしています

- (IBAction)variablePressed:(UIButton *)sender {
NSString *variable = [sender currentTitle];
if (!_variableToBePassedIntoTheDictionary) _variableToBePassedIntoTheDictionary = [[NSMutableArray alloc] init];
[_variableToBePassedIntoTheDictionary replaceObjectAtIndex:0 withObject:variable];}

しかし、このプログラムを実行すると、例外が発生した場合に警告を表示するようにデバッガーを設定しているため、プログラムは最後の行で中断します。ブレークポイントなしでプログラムを実行すると、プログラムは SIGARBT を与えてクラッシュします。次に、これらの値をディクショナリに割り当てます。ディクショナリは、さらなる計算のためにモデルに渡されます。

- (IBAction)testVariableValues:(id)sender {
if (!_variablesAssignedInADictionary) _variablesAssignedInADictionary = [[NSMutableDictionary alloc] init];
[_variablesAssignedInADictionary setObject:_digitToBePassedIntoTheVariable forKey:_variableToBePassedIntoTheDictionary];
NSLog(@"%@", _variablesAssignedInADictionary);}

PS私はObjective Cの初心者です。誰でもいつ使用するのか説明してもらえますか

@synthesize someProperty;

@synthesize someProperty = _someProperty;

ありがとう!

4

4 に答える 4

2

メソッドが初めて呼び出されたときに、 を作成し、NSMutableArray存在しないオブジェクトを置き換えようとします。リファレンスには次のように書かれています。

- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject

置き換えるオブジェクトのインデックス。この値は、配列の境界を超えてはなりません。インデックスが配列の末尾を超えている場合、NSRangeException を発生させます。

また0、空の配列の境界を超えます。

代わりにこれを試してください:

- (IBAction)variablePressed:(UIButton *)sender
{
    NSString *variable = [sender currentTitle];
    if (_variableToBePassedIntoTheDictionary == nil)
    {
        _variableToBePassedIntoTheDictionary = [[NSMutableArray alloc] init];
        [_variableToBePassedIntoTheDictionary addObject:variable];
    }
    else
    {
        [_variableToBePassedIntoTheDictionary replaceObjectAtIndex:0 withObject:variable];
    }
}
于 2012-06-24T14:23:30.680 に答える
1

非常に簡単な質問:

あなたはそれが例外で止まると言いました。けっこうだ。例外はどうですか?推測させてください、範囲外の例外ですか?例外は、ほとんどの場合、何が問題なのかを示します。

replaceObjectAtIndex:0:そのインデックスに何かありますか?おそらくそうではありません。

于 2012-06-24T14:25:07.040 に答える
1

コードで条件をテストします。

if(!_variableToBePassedIntoTheDictionary)

条件がtrueの場合、つまり配列がnilの場合は、それをalloc-initします。次のステートメントで:

[_variableToBePassedIntoTheDictionary replaceObjectAtIndex:0 withObject:variable];
、インデックス0のオブジェクトを変数に置き換えようとします。ただし、上記の場合、配列をalloc-initするだけでは空であり、インデックス0のオブジェクトを存在しないものとして置き換えることはできません。これにより、例外が発生します。

***キャッチされなかった例外'NSRangeException'が原因でアプリを終了しています、理由:'***-[__ NSArrayM replaceObjectAtIndex:withObject:]:空の配列の境界を超えたインデックス0 '

したがって、あなたがしなければならないことは、次のように最後の行を変更することです:

if([_variableToBePassedIntoTheDictionary count]==0) {
  [_variableToBePassedIntoTheDictionary addObject:variable]
} else {
[_variableToBePassedIntoTheDictionary replaceObjectAtIndex:0 withObject:variable]
}

プロパティに関する2番目の質問に関しては、synthesisの役割は、@propertyに割り当てた属性に基づいてsetter/getterメソッドを作成することであると考えてください。新しいObjective-Cでは、プロパティに関連付けられたivarを宣言する必要はありません(ivarはプロパティを表すインスタンス変数です)。コンパイラはデフォルトでivarにプロパティの名前を割り当てます。を使用して

@synthesize someProperty = _someProperty

慣例では、ivarを_somePropertyと呼ぶように指定します。デフォルトのアプローチに対するこのアプローチの利点は、setter / getterメソッドとivarを直接使用してプロパティへのアクセスを混同できないことです。つまり、次のような間違いを犯すことはありません。

someProperty=value

しかし、代わりにあなたは書く必要があります:

_someProperty=value
or
self.someProperty=value

とにかく、これについてはObj-Cのドキュメントを見てください、それはかなり網羅的です。

于 2012-06-24T14:26:20.430 に答える
1

Taken from the docs :

The index of the object to be replaced. This value must not exceed the bounds of the array.

As I see from your code your array is initialized and there is no object at index 0. hence you try to replace an object at an index which is out of bounds as your array is empty.

于 2012-06-24T14:21:37.623 に答える