9

したがって、プロパティの自動合成は素晴らしいです。ただし、getter と setter の両方を指定すると、エラーが発生します。

@property (strong, nonatomic) NSArray *testArray;

- (NSArray *)testArray {
    return _testArray;
}

- (void)setTestArray:(NSArray *)testArray {
    _testArray = testArray;
}

エラー: Use of undeclared identifier '_testArray'

追加@synthesize testArray = _testArray;すると問題が解決します。これはなぜですか?

4

3 に答える 3

8

最新のコンパイラ/ランタイムで、使用する場合

@synthesize testArray = _testArray;

コンパイラが作成する

  • まだ存在しない場合_testArrayivar 。
  • 実装していない場合testArrayメソッド。
  • setTestArray:メソッド (実装していない場合)

使用する場合

@synthesize testArray;

コンパイラーは、testArray.ivar が存在しない場合は、代わりに ivarを作成し_testArrayます。

を使用せず@synthesize、自動合成に依存している場合、ivar は次の_testArray場合にのみ作成されます (両方を適用する必要があります)。

  • _testArrayまだ存在しません。
  • 少なくとも 1 つのメソッドが合成されています ( の getter readonly、 getter および/または の setter readwrite)。

あなたの例では、すべてのメソッドを実装しているため、自動合成は合成されないため、ivar は作成されません。_testArrayivar を自分で宣言するか、明示的な統合を使用することができます。

于 2012-10-16T15:56:16.130 に答える
8

getter と setter の両方を提供する場合、多くの場合、インスタンス変数はまったく必要ありません。つまり、それらのメッセージを転送したり、データを他の場所に保存したりするだけの場合です。

それらのいずれかが欠落するとすぐに、その機能を合成するために ivar が必要になります。

私の記憶が正しければ、読み取り専用プロパティについても同様の仮定が成り立ちます。

于 2012-10-16T15:44:37.520 に答える
-1

私はいくつかのテストを行いました:

最近の Objective-c の規約では、プロパティを合成する必要はありません。

もしあなたがそうするなら

@property (strong, nonatomic) Business* theBiz;

iOs は、_theBiz という名前のプライベート ivar 変数を自動的に作成します。

ゲッターまたはセッターのみを実装すると、問題なく動作するようです。

-(void)setTheBiz:(Business *)theBiz
{
    _theBiz = theBiz;
}

ただし、両方を宣言すると、どちらかが空の関数であってもコンパイル エラーが発生します。

-(void)setTheBiz:(Business *)theBiz
{
    _theBiz = theBiz;
}

-(Business *) theBiz
{

}

getter と setter の両方を実装すると、_theBiz のようなものがないというコンパイル エラーが発生します。

これは、次を追加することで簡単に修正できます。

@synthesize theBiz = _theBiz;

しかしそれでは、Objective-c のこの素晴らしい新機能の要点がすべて台無しになります。

これは仕様によるものなのか、それとも何かが足りないだけなのだろうか。アップルって何?

私の最善の推測は、それはバグです。

ギヨームの答えは、その事実に対処していません。

彼は言った

少なくとも1 つのメソッドが合成されました

getter か setter のどちらか一方だけが設定れていれば _theBiz が作成されていたようです。両方が設定されている場合、それは作成されなくなり、バグである必要があります。実際、何も設定する必要はなく、ivar は引き続き作成されます。

それを修正する唯一の方法は、明示的に行うことです

@synthesize theBiz = _theBiz;
于 2012-10-19T08:59:14.733 に答える