0

myArray がインスタンス変数を隠しているというエラーが発生しています。エラーの意味と修正方法を簡単に説明してください。助けてくれてありがとう。私はobjective-cを使ったプログラミングが初めてです

- (IBAction)buttonPushed:(id)sender
{
    NSArray *snarkyCommentArray = [[NSArray alloc] initWithObjects: @"Butter",@"Cheese",@"Gravy",@"Your fat",@"smells like roses",nil];


    self.snarkOffLabel.text = [snarkyCommentArray objectAtIndex:(1)];

}
@end
4

4 に答える 4

0

次の点を考慮してください。

@interface myClass : NSObject{
NSString *name;
}

- (void)print:(NSString*)name;
- (void)printName;
@end

@implementation myClass

- (void)print:(NSString*)name{
    // This line will print the local variable 'name', not the instance variable 'name'
    // This line will cause a warning to the effect "Local variable hides instance variable"

    NSLog(@"%@", name);
}

- (void)print{
    // This line will print the instance variable 'name'.
    NSLog(@"%@", name);

    NSString *name = @"Steve";

    // This line will print the local variable 'name'.
    // This line will cause a warning to the effect "Local variable hides instance variable"
    NSLog(@"%@", name);
}
@end

インスタンス変数とローカル変数の違いを理解することが重要です。インスタンス変数は、クラスの「@interface」セクションで定義された変数です。例:

@interface myClass : NSObject {
// Instance variables
NSString *name;
float progressAmount;
NSUInteger *age;
}
@end

インスタンス変数には、クラスの任意のメソッドからアクセスできます。ローカル変数は、ローカル スコープを持つ変数であり、宣言されているメソッドまたはブロック内でのみアクセスできます。例:

- (int)square:(int)num{
    int result = num * num;
    return result;
}

前の例では、numとの両方resultがローカル変数です。メソッドは、彼らのsquare:宇宙全体です。それらは外部からアクセスすることはできず、戻ってくるsquare:と存在しませんsquare:。それらはローカルスコープを持つと言われています。

では、インスタンス変数とローカル変数に同じ名前を付けるとどうなるでしょうか? それはすべて範囲に帰着します。スコープに関しては、ローカル変数はインスタンス変数よりも優先されるため、使用する変数の決定に直面した場合、コンパイラはローカル変数を使用します。これが、コンパイラがエラーではなく警告を生成する理由です。起こっていることはまったく問題ありませんが、それでもプログラマーに警告することをお勧めします。

于 2012-11-16T04:51:13.600 に答える
0

どこが間違っているかチェックしてみましたNSLogか?snarkyCommentArrayあなたの弦を保持しているかどうか知っていますか? みたいにチェック

Nslog(@"snarkyCommentArray %@",snarkyCommentArray);

それがすべてを保持する場合は、ラベルに注意してください。self好きでなくても使用できます

snarkOffLabel.text = [snarkyCommentArray objectAtIndex:(1)];

それでもうまくいかない場合は、次のようNSMutableArrayに配列を割り当てます。

NSMutableArray *snarkyCommentArray = [[NSMutableArray alloc] initWithObjects: @"Butter",@"Cheese",@"Gravy",@"Your fat",@"smells like roses",nil];

それが役に立てば幸い。

于 2012-11-16T07:32:31.863 に答える
0

コードは質問と一致しませんが、エラー メッセージについて説明することはできます。

クラスでインスタンス変数を定義してから、同じ名前のローカル変数を作成すると、コンパイラはインスタンス変数ではなくローカル変数が使用されることを警告します。ローカル変数はインスタンス変数を「隠しています」。

混乱を避けるために、ローカル変数にインスタンス変数と同じ名前を付けないようにすることをお勧めします。一般的な方法は、すべてのインスタンス変数に_myArray. このように、コードを読んでいるときはいつでも、どの変数がインスタンス変数でどれがそうでないかが非常に明白です。

selfこの問題を回避する別の方法は、ポインターを介してインスタンス変数を参照することです。

クラスに という名前のインスタンス変数がfooあり、 という名前のローカル変数があるとしfooます。

foo = 5; // local variable
self->foo = 10; // instance variable
于 2012-11-16T04:09:18.067 に答える
0

ivar とローカル変数は同じ名前だと言えます。したがって、いずれかの名前を変更する必要があります。または、矢印演算子を使用して ivar にアクセスします。

于 2012-11-16T04:11:14.053 に答える