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