2

私はまだ CocoaTouch のニュアンスを学んでいます。ARC 環境で、float、int などの型に対して内部的に生成されるゲッター/セッターの種類は何ですか?

プロパティが非 ARC のオブジェクトである場合、次のようなものになる可能性があることを知っています。

- (NSURL *)url {
  if (_url == nil) 
    _url = [[MyURL alloc] initWithURL:url];
  return _url
}

- (void)setUrl:(NSURL *)theUrl {
    if (theUrl != _url) {
      [_url release];
      _url = [theUrl retain];
    }
}

ただし、ARC 環境ではリリースと保持は使用できません。この場合、ARC 環境用にどのようなゲッター/セッターが自動的に作成されますか。

また、float や int などのスカラー型についてはどうでしょうか。

4

2 に答える 2

4

ARC がすべてのリリースと保持を処理します。おそらく、合成されたゲッターとセッターを使用する必要がありますが、そうでない場合は、ivar を設定し、他のすべてのコードを削除してください。

于 2013-05-07T20:09:56.953 に答える
3

いくつかの考え:

  1. int基本的なデータ型 ( 、など)のアクセサー メソッド (ゲッターとセッター) はbool、オブジェクトの標準的なアクセサー メソッドと非常によく似ています。唯一の違いは、メモリ管理のセマンティクスがないことです。オブジェクトのコンテキスト内を除いて意味します。したがって、nostrongまたはweakwith これらの基本的なデータ型が表示されます。したがって、の概念retainも当てはまりません。

  2. 舞台裏では、ARC でプロパティとして宣言されたオブジェクトのシステム生成セッターは、非 ARC コードのオブジェクトstrongのプロパティのセッターと似ていません。retain保持カウントが増加します(別名「強い参照を維持する」)。さて、明らかに、strongプロパティの ARC セッターを自分で書いていた場合 (実際にはそうすべきではありません)、 というコード行を書いているわけではありませんretainが、コンパイラは舞台裏で効果的にそれを行っています。

  3. 意味がよくわからないため、ゲッターメソッドを作成することはよくわかりません。通常、ゲッターは何もしていませallocinit

  4. あなたのセッターは少し近いです(これは@propertyas として宣言されたものだと思いretainます)。明らかに、自動的に合成されたセッターは自動的にメモリ有効期間修飾子 ( retainvs. assignvs. copyvs. ... など) を取得し、適切なコードを生成するので、それ自体に任せたほうがよいでしょう。

  5. ちなみに、実際のシステム生成セッターには KVO ( key-value-notification ) 呼び出しも含まれます。KVO とは何かを気にする必要はありませんが、重要なことは、コードに独自の手書きのセッター メソッドを散らかしたくないということです。KVO を使い始めると後悔するからです。これは、コンパイラに独自のアクセサ メソッドを合成させるもう 1 つの理由です。

于 2013-05-08T02:43:46.600 に答える