1

だから、私はObjective-Cの学習を始めたばかりで、この「自己」に出くわしました。私はCしか使ったことがありませんが、Javaでも使われているのではないでしょうか? 誰か説明できますか?次に例を示します。

- (IBAction)digitPressed:(UIButton *)sender
{
    NSString *digit = [sender currentTitle];
    UILabel *myDisplay = [self display];  //why this?
}

なんでこれだけじゃないの?

- (IBAction)digitPressed:(UIButton *)sender
{
        NSString *digit = [sender currentTitle];
        UILabel *myDisplay = display;  //why not like this?
}

表示は UILabel *

4

5 に答える 5

3

[self display]、またはは、.h ファイルにこのようなものがある場合、プロパティ/メソッドself.displayを参照します(プロパティはとにかく get/set メソッドのショートカットにすぎません)。

@property (weak, nonatomic) UILabel* display;

また

-(UILabel*)display;

だけdisplay、またはインスタンス変数self->displayを参照します。これは、次のようにインスタンス var を宣言した場合に有効です。

@implementation MyClass {
    UILabel* display;
}

.h ファイルでプロパティを宣言し、displayそのデフォルトを変更していない場合、対応するインスタンス var は_display(アンダースコアに注意) になります。この場合、以下は同じになります self.displayself->_display

于 2013-06-21T01:59:33.930 に答える
1

この場合、それは目的の C メッセージングです。ブラケットが表示されると、次のようになります。

[Object Message]

基本的に、self はオブジェクトで、display は送信するメッセージです。メッセージの送信は、別の言語でのメソッド呼び出しに似ていますが、内部では少し異なります。だから、このようなもの:

[self doSomethingCool];

Objective C では、別の言語では次のように変換されます。

this.doSomethingCool();

もちろん、別のオブジェクトでメソッドを実行する場合は、次のように self をそのオブジェクトに置き換えます。

[myObject doSomethingCool];

多くの言語では、メソッド呼び出しの前に「this」を付ける必要はありません。これを含めない場合、作業中のオブジェクトでメソッドを実行していることを意味します。似たようなことを始めたとき、かなり早い段階で火傷を負いました。オブジェクトを保存できる datalayer メソッドへの呼び出しがあり、整数が返されます。オブジェクトを保存するときに、メソッド呼び出しの前に自己を配置しませんでした。それは本質的に新しいオブジェクトを生成して保存していたため、正しい整数が返されませんでした。

「self」を使用すると、「私はこのオブジェクトを使用しています」と明示的に伝えられます。プロパティについても同じことが言えます。私は常に「MyProperty」の代わりに「self.MyProperty」を使用します。これは、明示的であり、作業中のオブジェクトの MyProperty を使用していることを確認するためです。そのような欠陥はほとんどありません。あなたが特定のオブジェクトを使用していると予想し、環境が別のオブジェクトを使用していると考えている場合、あなたが何かに遭遇すると、すべてが正しく見えるため、頭を悩ませます。

于 2013-06-21T02:25:15.793 に答える
0

これについては非常に良い説明があります: http://useyourloaf.com/blog/2011/02/08/understanding-your-objective-c-self.html

あなたの質問の重要なセクションは、Objective-C 2.0 ドット構文に関するセクションです。

Objective-C のドット構文

ドット構文は Objective-C 2.0 で導入され、多くの議論を引き起こしました。経験豊富で長年の Cocoa プログラマーの多くは、完全に回避することを推奨しています。Chris Hanson などの他の人は、プロパティとドット表記をいつ使用するかについて異なる見解を持っています。議論のどちら側に落ちても、主なことは一貫性を保つことだと思います。

とにかく、ドット構文について理解しておくべき主なことは、次の 2 つのステートメントが同じことを行っているということです。

self.timestamp = [NSDate date];
[self setTimestamp:[NSDate date]];

ドットは、従来の Objective-C メソッド呼び出しの単なるショートカットです。ドットが表示されたら、それを同等の角括弧メソッド呼び出し構文に置き換えることができます。ただし、これは次のように書くことと同じではないことを理解することが重要です。

タイムスタンプ = [NSDate 日付]; self オブジェクトとドットがなければ、オブジェクトにメッセージを送信するのではなく、timestamp という名前の ivar に直接アクセスします。これは setter メソッドをバイパスするため、最初に古い NSDate オブジェクトを解放せずにタイムスタンプ ivar を上書きします。また、割り当てている新しいオブジェクトも保持しません。これらの状況はどちらも悪いです!

例は ARC を使用せずに書かれていることに注意してください。そのため、メモリ管理、保持、解放などへの参照がたくさんあります。ただし、ARC がバックグラウンドで何をしているのかを理解するために、これらの例を参照することは役に立ちます。

あなたの例では、実際の表示プロパティを参照していません。実際に[self display]は、この場合は UIViewController である「自己」オブジェクトのインスタンス メソッドを参照しています。

于 2013-06-21T01:00:12.053 に答える