web-dev-qa-db-ja.com

目的cでBOOLインスタンス変数を作成するにはどうすればよいですか?

Objective-Cクラスの1つで、BOOL型のインスタンス変数をデフォルト値Falseで作成する必要があります。どうすればよいですか?私は人々が.hファイルでそれを定義しているのを見てきましたが、この変数を公開する必要はありません。したがって、それを私の.mファイルに入れるべきではありませんか?また、プロパティにする必要がありますか?それとも私は何かをプロパティにしないでください?ありがとう。

17
Nosrettap

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:またはmyBoolMyClassのオブジェクトに送信できることに注意してください。

24
JeremyP

プライベート変数を作成する場合は、カテゴリの機能を使用できます。たとえばクラス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
13
graver

BOOLは、単純な_BOOL myBool_を持つiVarsとして、および@property (nonatomic, assign) BOOL myBoolを持つプロパティとして宣言されます。ただし、BOOLean値はNO(nil)に初期化されます。 BOOLを他のクラスからアクセスできるようにする必要がある場合、またはmファイルで「グローバル」にする必要がある場合は、iVarまたはプロパティを使用します。それ以外の場合は、個別のメソッドでスコープ付き変数として宣言します。

2
CodaFi

宣言を.mファイル。

あなたがそれからプロパティを作るかどうかは、あなたが望むものに依存します。プロパティとして、後でチェック/ガード/何でも含むセッター/ゲッターを適用できます。さらに、Key-Value-Accessを適用できます。

これのいずれかが必要ない場合、プロパティは実際には必要ありません(ただし、良い習慣:コードがどのように進化するかはわかりません)。

1
Matthias

プロパティにすると、パブリックになります。変数をパブリックにしたくない場合は、プロパティを使用しないでください。なぜあなたは公になりたくないのですか?読み取り専用プロパティを設定し、プライベートカテゴリを介して.mで書き込み可能にすることができます。

IOS 5を使用している場合は、.mファイルに追加できます。

@implementation MyClass {
     BOOL _myBool;
}

これはiOS5の新機能だと思います。しかし、私もこのようなコードを見ました:

@implementation MyClass {
@private
     BOOL _myBool;
}

お役に立てれば。

0
Pfitz