9

selfiPhone開発アプリケーションでこの式を使用する必要があるのはいつですか?私は2つのフィールドを持っていると言います:UITextField *text1;そしてNSString *str1;保持され、合成されます。

これらの2つのフィールドのいずれかにアクセスしているとき、いつ使用する必要があり、いつ使用self.text1しないでself.str1ください。

4

6 に答える 6

8

selfキーワードではなく、式です。さらに、自分自身、または自分自身のメソッドやプロパティを直接参照する場合はいつでも使用できます。「あなた自身」とは、もちろん、あなたが操作しているクラスのインスタンスを指します。

于 2010-11-02T17:45:36.480 に答える
7

self.-expression を使用してプロパティにアクセスすることが一般的に推奨されない特定の状況があります。通常 、プロパティへのアクセスには常に 使用します。 これは最も安全で簡単な方法です。特に保持を使用した場合は、メモリ管理が自動的に行われます。self

この規則の 2 つの例外:

  • 任意initの方法。
  • dealloc

どちらの場合も、部分的に初期化されたオブジェクトを扱っています。ここでセッターまたはゲッターを使用すると、いくつかの副作用が発生する可能性があります。これらはメソッドであるため、オーバーライドされる可能性があるためです。

たとえば、クラスによってサブクラス化されAたプロパティを持つクラスを考えてみましょう。サブクラスはプロパティを追加し、のセッターをオーバーライドします。いくつかの初期値を使用したため、メソッドは を呼び出します。ただし、サブクラスは、このセッターの値にもアクセスします。しかし、この場合、bar が初期化されておらず、任意のデータを指している可能性があります。init my cause crashes でセッターを呼び出すと、独自のコードでは確率が高すぎない場合があります。fooBBbarfooinitsetFoo:self.foo = ...bar

于 2010-11-02T19:03:17.660 に答える
6

この例では、を使用するときにインスタンス変数に直接アクセスする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に直接アクセスする必要があります。

于 2010-11-02T17:50:10.263 に答える
5

selfカスタムゲッターがある場合は、メソッド呼び出し内で使用することもお勧めします。managedContextCoreDataを使用するアプリケーション内のオブジェクトは良い例です。で参照すると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
于 2010-11-02T17:51:59.403 に答える
1

変数を「合成」する場合は、「自己」にする必要があります。変数。経験則

于 2011-03-09T13:05:00.337 に答える
0

thisObjective-cについては何も知りませんが、これは他の言語(C ++、C#、Java、PHPなど)のキーワードによく似ています。もしそうなら、私のアドバイスは常にそれを使用することです。そうすれば、(誤って)同じ名前のローカル変数を定義した場合でも、コードが壊れることはありません。

ただし、これは、プログラマーコミュニティでの炎上戦争の歴史を伴う宗教的な議論のようなものであることも付け加えなければなりません。ですから、このアドバイスを一粒の塩で受け止め、あなたにとって最も理にかなっていると思われるものを使用してください。それについて一貫しているだけです。

于 2010-11-02T17:48:43.767 に答える