self
iPhone開発アプリケーションでこの式を使用する必要があるのはいつですか?私は2つのフィールドを持っていると言います:UITextField *text1;
そしてNSString *str1;
保持され、合成されます。
これらの2つのフィールドのいずれかにアクセスしているとき、いつ使用する必要があり、いつ使用self.text1
しないでself.str1
ください。
self
iPhone開発アプリケーションでこの式を使用する必要があるのはいつですか?私は2つのフィールドを持っていると言います:UITextField *text1;
そしてNSString *str1;
保持され、合成されます。
これらの2つのフィールドのいずれかにアクセスしているとき、いつ使用する必要があり、いつ使用self.text1
しないでself.str1
ください。
self
キーワードではなく、式です。さらに、自分自身、または自分自身のメソッドやプロパティを直接参照する場合はいつでも使用できます。「あなた自身」とは、もちろん、あなたが操作しているクラスのインスタンスを指します。
self.
-expression を使用してプロパティにアクセスすることが一般的に推奨されない特定の状況があります。通常 、プロパティへのアクセスには常に 使用します。 これは最も安全で簡単な方法です。特に保持を使用した場合は、メモリ管理が自動的に行われます。self
この規則の 2 つの例外:
init
の方法。dealloc
。どちらの場合も、部分的に初期化されたオブジェクトを扱っています。ここでセッターまたはゲッターを使用すると、いくつかの副作用が発生する可能性があります。これらはメソッドであるため、オーバーライドされる可能性があるためです。
たとえば、クラスによってサブクラス化されA
たプロパティを持つクラスを考えてみましょう。サブクラスはプロパティを追加し、のセッターをオーバーライドします。いくつかの初期値を使用したため、メソッドは を呼び出します。ただし、サブクラスは、このセッターの値にもアクセスします。しかし、この場合、bar が初期化されておらず、任意のデータを指している可能性があります。init my cause crashes でセッターを呼び出すと、独自のコードでは確率が高すぎない場合があります。foo
B
B
bar
foo
init
setFoo:
self.foo = ...
bar
この例では、を使用するときにインスタンス変数に直接アクセスするself
のではなく、定義したプロパティにアクセスします。
この例を考えてみましょう。
@interface Foo : NSObject {
NSString *_bar;
}
@property (nonatomic, retain) NSString *bar;
@end
@implementation Foo
@synthesize bar = _bar;
-(void)baz {
_bar = @"ivar"; //accessing the ivar
self.bar = @"property"; //accessing the ivar via the property
}
@end
一般に、プロパティを使用している場合、ivarを利用する理由はほとんどありません。これには、値を自動的に保持および解放するという追加の利点があります。
readonly
ただし、プロパティに修飾子がある場合は他にもあります。このような場合、値を設定するには、ivarに直接アクセスする必要があります。
self
カスタムゲッターがある場合は、メソッド呼び出し内で使用することもお勧めします。managedContext
CoreDataを使用するアプリケーション内のオブジェクトは良い例です。で参照するとself.managedContext
、オブジェクトをオーバーライドして、必要なものに設定できますnil
。Core Dataを使用するアプリケーションを作成するときは、XCodeによって生成されるコードを参照してください。
XCodeによって生成されたコードの例を実際に示します。
@interface YourAppDelegate : NSObject <UIApplicationDelegate>
{
@private
NSManagedObjectContext *managedObjectContext_;
}
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@implementation ContractionTimerAppDelegate
/**
Returns the managed object context for the application.
If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application.
*/
- (NSManagedObjectContext *)managedObjectContext {
if (managedObjectContext_ != nil) {
return managedObjectContext_;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext_ = [[NSManagedObjectContext alloc] init];
[managedObjectContext_ setPersistentStoreCoordinator:coordinator];
}
return managedObjectContext_;
}
@end
変数を「合成」する場合は、「自己」にする必要があります。変数。経験則
this
Objective-cについては何も知りませんが、これは他の言語(C ++、C#、Java、PHPなど)のキーワードによく似ています。もしそうなら、私のアドバイスは常にそれを使用することです。そうすれば、(誤って)同じ名前のローカル変数を定義した場合でも、コードが壊れることはありません。
ただし、これは、プログラマーコミュニティでの炎上戦争の歴史を伴う宗教的な議論のようなものであることも付け加えなければなりません。ですから、このアドバイスを一粒の塩で受け止め、あなたにとって最も理にかなっていると思われるものを使用してください。それについて一貫しているだけです。