2016-04-01 14 views
0

私はいくつかのObjective-Cのコードを持っている:私はこのクラスを実装する場合Objective-Cの同じクラスのメソッド内部でクラスの値をどのように参照していますか?

@interface CustomInitializers:NSObject 
{ 
    NSString *classStr; 
    NSInteger classInt; 
} 
+ (id) init; 
+ (id) initWithString: (NSString *) stringToSet; 
+ (id) initWithInteger: (NSInteger) intToSet; 
+ (id) initWithAll:(NSString *)stringToSet classInt:(NSInteger)intToSet; 
- (NSInteger) getClassInt; 
- (NSString *) getClassStr; 
@end 

、Iは下線(例えば_classStr)でそれらを付けることにより、変数を参照します。ただし、コンパイル時にエラーメッセージが表示されます。

[file name]:[line number]:[character]: Usage of undeclared identifer "_randSen" 

これを防ぐにはどうすればよいですか?

答えて

0

次のインスタンス変数:

{ 
    NSString *classStr; 
    NSInteger classInt; 
} 

は両方インスタンスにクラスの変数をスコープしています。

@property (strong, nonatomic) NSString *classStr; 
@property (strong, nonatomic) NSInteger classInt; 

生成されるインスタンス変数にアクセスするためのゲッターとセッターが生成されます。自動生成されたインスタンス変数は、アンダースコアが付加されたプロパティ名で構成されます。

インスタンス変数を作成するだけです。したがって:

NSString *classStr; 
NSInteger classInt; 

実際にはインスタンス変数です。あなたはアンダースコア(適切な方法論)を先頭に追加するためにそれらを望んでいた場合は、次のようなそれらを付加する必要があります実際には

NSString *_classStr; 
NSInteger _classInt; 

を、彼らはあなたのヘッダーにしている場合は、プロパティを使用する必要があります。スコープ付きインスタンス変数としてプライベートインスタンス変数のみを実行する必要があり、これらは、ヘッダーではなく実装ファイルに存在します。 link

+0

ありがとう:

より詳細にこれを説明するそこにたくさんの情報があります!プロパティがゲッターとセッターを生成するのを止める方法はありますか? – InitializeSahib

+0

いいえ、プロパティの目的は、ゲッター/セッター/インスタンス変数を自動生成することです。それはかなり標準です。プライベートプロパティが必要な場合は、それを実装ファイルに入れてください。実際にインスタンス変数(実際には非常に特別な理由があり、一般的に正当な理由がない場合は推奨されません)を望むのであれば、変数を実装ファイルに移動し、それらを示すためにアンダースコアインスタンス変数として。 – TheCodingArt

+0

プロパティを使用する必要がある時間の99%ただし、 – TheCodingArt

0

変数がメソッド内で宣言されている場合、変数がそのスコープ内にのみ存在することを意味します。したがって、単純な答えはアクセスできないということです。解決策は、クラス内のどのメソッドからでもアクセスできるように、変数をインスタンスプロパティにすることです。

関連する問題