2

次の例では、何件のメッセージが に送信されmyObjectますか?

- (void) myMethod:(id) myObject
    NSLog(@"%@", myObject.myStringProperty);
    NSLog(@"%@", myObject.myStringProperty);
    NSLog(@"%@", myObject.myStringProperty);
}

Objective-c が返された値myStringPropertyをスタックにキャッシュする可能性があることに興味があります。によって返される値はmyStringProperty、連続するメッセージ間で変化する可能性があるため、おそらくキャッシュは意味がありません。

4

2 に答える 2

4

Objective-c が myStringProperty によって返された値をスタックにキャッシュする可能性があることに興味があります。myStringProperty によって返される値は、連続するメッセージ間で変化する可能性があるため、おそらくキャッシュは意味がありません。

いいえ、キャッシュされません。myObjectもちろんそうでない場合、すべてのobjcメッセージが送信されますnil

コンパイラは、メソッドの実行における副作用 (1) やグローバル状態の影響 (2) については何も知りません。

  1. たとえば、 myObject またはそれが参照するものは、取得の実行中に変更されmyStringPropertyますか?
  2. たとえば、結果は現在の時間の影響を受けますか?
于 2012-01-26T00:52:41.983 に答える
2

-[myObject myStringProperty] にブレークポイントを設定して、自分の目で確かめてください。myStringProperty が自分で実装するゲッター メソッドである場合は、メソッド実装の横にある左側のガターをクリックして、ブレークポイントを設定します。

これが合成されたアクセサー メソッドである場合は、Xcode のブレークポイント ナビゲーターでシンボリック ブレークポイントとして入力します。ナビゲーター セクションの右矢印アイコンをクリックしてブレークポイント ナビゲーターを選択し、ウィンドウの下部で + を押して、[Add Symbolic Breakpoint…] を選択します。シンボル フィールドに -[TheClassName myStringProperty] と入力し、[完了] をクリックします。

于 2012-01-26T00:44:04.500 に答える