8

Xcode 4.5には、プロパティとそれに関連するメモリ解放セクション(deallocとviewDidUnload)の自動生成方法が少し異なりますか?

昨日、4.5Beta1からXcode4.5にアップグレードしました。これで、Interface Builderを使用してアウトレットを作成すると(たとえば、UILabelから関連するヘッダーファイルにCtrlキーを押しながらドラッグすることで)、@property通常どおりヘッダーに宣言が作成されます。

@property (retain, nonatomic) IBOutlet UILabel *propertyName;

ただし、関連付けられた.mファイルには、@synthesize宣言はありません。

のコードviewDidUnloadは正常です:

- (void)viewDidUnload {
    [self setPropertyName:nil];
    [super viewDidUnload];
}

ただし、のコードはプロパティ名の前に次のようにdealloc追加します。_

- (void)dealloc {
    [_propertyName release];
    [super dealloc];
}

これは、プロパティを通常どおりに参照できないことも意味します([propertyName doSomething];

何か変わった?または、誤って設定を変更しましたか?

4

5 に答える 5

14

はい、Xcode 4.5 で動作が若干変更されました。

... 関連する .m ファイルには、@synthesize 宣言がありません。

Xcode 4.5 では、@synthesizeステートメントはオプションになり、プロパティは自動的に合成されます。したがって、自動生成された IBOutlet プロパティは不要になっ@synthesizeたため、追加されなくなりました。

... dealloc のコードは、プロパティ名の先頭に _ を追加します

プロパティが (明示的な @synthesize ステートメントなしで) 自動的に合成される場合、対応するインスタンス変数の前にアンダースコアが追加されます。そのため、dealloc メソッドでそのように表示されます。これは、インスタンス変数とプロパティ名が重複しないようにするためです。

これは、プロパティを通常どおり参照できないことも意味します

いいえ。インスタンス変数とプロパティへのアクセスは変更されていません。変更されたのは、インスタンス変数のデフォルト名だけです。例えば:

_foo = @"Bar"; // Setting an instance variable directly.
self.foo = @"Bar";  // Setting an instance variable via a property accessor method.

アンダースコアは単にスタイルの問題であるため、プロパティではなくインスタンス変数にアクセスしていることがより明確になります。

@synthesize ステートメントを自分で追加できることに注意してください。これにより、対応するインスタンス変数の名前が強制的に任意になります。同様に、独自のプロパティ アクセサー メソッドを追加すると、インスタンス変数が自動的に生成されなくなります。

于 2012-09-23T05:56:03.597 に答える
3

Xcodeは、すべてのプロパティを自動合成して、と呼ばれるインスタンス変数になるようになりました_propertyName。多くの場合@synthesize、インスタンス変数を明示的に宣言する必要はありません。

于 2012-09-23T05:23:45.140 に答える
2

XCode 4.5では、デフォルトで、基になるインスタンス変数にアンダースコアが追加されます。ただし、これがもたらす唯一の影響は、その変数をアンダースコアで参照する必要があることです。次に例を示します。

@property (retain) UIColor color;

実装コードでは、次のような色を参照できます。

[_color set]; // Now do some drawing...

外の世界では、物事は変わりません。

object.color = [UIColor redColor];

この変更は、インスタンス変数にアンダースコアプレフィックスを付けて、コード内のローカル変数と区別するための一般的な方法に基づいています。

于 2012-09-23T05:27:30.747 に答える
0

また、通常はプロパティにとしてアクセスする必要があることに注意してください。その[self.propertyName doSomething];ため、インスタンス変数の前にアンダースコアを付けてプライバシーを示すのが理にかなっています。

本当に必要な場合は[_propertyName doSomething]、自動合成させるかのようにアクセスしますが、ゲッターをバイパスします。または、再び@synthesize propertyName = propertyName;使用できるようにすることもできます[propertyName doSomething]が、なぜそうするのでしょうか。

于 2012-09-23T05:29:13.813 に答える
-1

@property名の前にアンダースコアを使用すると、以前と同じように目的のメソッドを再度実装できることがわかりました。

于 2012-09-23T05:27:22.053 に答える