Objective-C クラスの 1 つでBOOL
、デフォルト値がの型のインスタンス変数を作成する必要があります。False
どうすればいいですか?人々が .h ファイルで定義しているのを見てきましたが、この変数を公開する必要はありません。したがって、.m ファイルに入れるべきではありませんか? さらに、それをプロパティにする必要がありますか?それとも、何かをプロパティにすべきではありませんか? ありがとう。
5 に答える
目的の c クラスの 1 つで、デフォルト値が FALSE の BOOL 型のインスタンス変数を作成する必要があります。どうすればいいですか?
現在の Xcode を使用していると仮定すると、次のように実装で ivar を宣言できます。
@implementation MyClass
{
@private
BOOL myBool;
}
人々が .h ファイルで定義しているのを見てきましたが、この変数を公開する必要はありません。
@interface
歴史的には、クラスの実装方法のためにインスタンス変数を宣言する必要がありました。これは、32 ビット OS X をターゲットにしている場合にのみ必要になります。
さらに、それをプロパティにする必要がありますか?
場合によります。クラスの外部 API の一部である場合は、必ずプロパティにする必要があります (無関係なクラスまたはサブクラスが使用するためです。オブジェクトの内部状態の一部にすぎない場合は、プロパティにする必要はありません (私はそうしません)。 t)。
それとも、何かをプロパティにすべきではありませんか? ありがとう。
ARC を使用しておらず、型がオブジェクト型 (BOOL ではない) の場合は、合成されたアクセサーのメモリ管理を利用するために、常にプロパティにする必要があります。ARC を使用している場合、Apple 開発者リストのアドバイスは、API プロパティの一部であるものと内部状態のものを ivar として作成することです。
内部状態の場合でも、KVO を使用したい場合があることに注意してください。その場合は、プロパティを使用してください。
この BOOL をプロパティとして宣言して合成すれば、ivar を明示的に宣言する必要はありません。プロパティをクラス自体にのみ「可視」にしたい場合は、クラス拡張を使用します
@interface MyClass()
@property (assign) BOOL myBool;
@end
@implementation MyClass
@synthesize myBool = myBool_; // creates an ivar myBool_ to back the property myBool.
@end
コンパイラは上記に対して警告を生成しますが、実行時に、どのクラスでものオブジェクトにsetMyBool:
またはを送信できることに注意してください。myBool
MyClass
プライベート変数を作成したい場合は、カテゴリの力を使用できます。たとえばクラス MyClass を作成し、.m ファイルで次のようにします。
#import "MyClass.h"
@interface MyClass() //This is an empty category on MyClass class
@property (nonatomic, assign) BOOL myBool;
@end
@implementation MyClass
@synthesize myBool = _myBool;
-(void)myMethod {
self.myBool = YES; //this is using the property
_myBool = NO; //this is the instance variable, as @synthesize creates an instance variable for you
// both are private
}
@end
BOOL は、単純な を使用して iVar として宣言されBOOL myBool
、 を使用してプロパティとして宣言されます@property (nonatomic, assign) BOOL myBool
。ただし、BOOLean 値は NO (nil) に初期化されることに注意してください。他のクラスから BOOL にアクセスできるようにする必要がある場合、または m ファイルで「グローバル」にアクセスできるようにする必要がある場合は、iVar またはプロパティを使用します。
宣言を.m
ファイルに入れることができます。
それからプロパティを作成するかどうかは、あなたが望むものに依存します。プロパティとして、後でチェック/ガードなどを含むセッター/ゲッターを適用できます。さらに、キー値アクセスを適用できます。
このいずれかが必要ない場合、プロパティは必要ありません (ただし、良い伝統: コードがどのように進化するかは決してわかりません)。
プロパティにするとパブリックになります。変数を公開したくない場合は、プロパティを使用しないでください。なんで公開したくないの?読み取り専用のプロパティを持ち、プライベート カテゴリを介して .m で書き込み可能にすることができます。
iOS 5を使用している場合は、.mファイルに入れることができます
@implementation MyClass {
BOOL _myBool;
}
これはiOS5の新機能だと思います。しかし、私もこのようなコードを見てきました:
@implementation MyClass {
@private
BOOL _myBool;
}
お役に立てれば。