Objective-Cクラスの1つで、BOOL
型のインスタンス変数をデフォルト値False
で作成する必要があります。どうすればよいですか?私は人々が.hファイルでそれを定義しているのを見てきましたが、この変数を公開する必要はありません。したがって、それを私の.mファイルに入れるべきではありませんか?また、プロパティにする必要がありますか?それとも私は何かをプロパティにしないでください?ありがとう。
Objective Cクラスの1つで、デフォルト値がFALSEのBOOL型のインスタンス変数を作成する必要があります。どうすればよいですか?
現在のXcodeを使用していると仮定すると、次のように実装でivarを宣言できます。
@implementation MyClass
{
@private
BOOL myBool;
}
私は人々が.hファイルでそれを定義するのを見てきましたが、この変数を公開する必要は本当にありません。
従来、クラスの実装方法が原因で、インスタンス変数を@interface
で宣言する必要がありました。これが必要になるのは、32ビットOS Xをターゲットにしている場合のみです。
また、プロパティにする必要がありますか?
場合によります。クラスの外部APIの一部である場合は、必ずプロパティにする必要があります(無関係なクラスまたはサブクラスで使用する場合。オブジェクトの内部状態の一部のみの場合は、プロパティにする必要はありません(私はそうしません) t)。
それとも私は何かをプロパティにしないでください?ありがとう。
ARCを使用しておらず、タイプがオブジェクトタイプである場合(BOOLはそうではありません)、合成されたアクセサーのメモリ管理を利用するために、常にそれをプロパティにする必要があります。 are 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は、単純な_BOOL myBool
_を持つiVarsとして、および@property (nonatomic, assign) BOOL myBool
を持つプロパティとして宣言されます。ただし、BOOLean値はNO(nil)に初期化されます。 BOOLを他のクラスからアクセスできるようにする必要がある場合、またはmファイルで「グローバル」にする必要がある場合は、iVarまたはプロパティを使用します。それ以外の場合は、個別のメソッドでスコープ付き変数として宣言します。
宣言を.m
ファイル。
あなたがそれからプロパティを作るかどうかは、あなたが望むものに依存します。プロパティとして、後でチェック/ガード/何でも含むセッター/ゲッターを適用できます。さらに、Key-Value-Accessを適用できます。
これのいずれかが必要ない場合、プロパティは実際には必要ありません(ただし、良い習慣:コードがどのように進化するかはわかりません)。
プロパティにすると、パブリックになります。変数をパブリックにしたくない場合は、プロパティを使用しないでください。なぜあなたは公になりたくないのですか?読み取り専用プロパティを設定し、プライベートカテゴリを介して.mで書き込み可能にすることができます。
IOS 5を使用している場合は、.mファイルに追加できます。
@implementation MyClass {
BOOL _myBool;
}
これはiOS5の新機能だと思います。しかし、私もこのようなコードを見ました:
@implementation MyClass {
@private
BOOL _myBool;
}
お役に立てれば。