2

私は Objective-C を学び始めていますが、質問があります。

クラスのプロパティを宣言するとき、これを行うことの違いは何ですか?

最初のケース:

@interface ViewController : UIViewController 
{
 UILabel *label;
}
@property(nonatomic,retain) UILabel *label;
@end

2 番目のケース:

@interface ViewController : UIViewController 
{

}
@property(nonatomic,retain) UILabel *label;

@end

最初のケースでは、1 つの属性 (UILabel *label) を持つクラスを宣言し、後でそのラベルのプロパティを宣言しています。

2 番目のケースでは、プロパティのみを宣言します。クラス属性を宣言する必要があるといつも思っていました。

4

2 に答える 2

2

最初のケースでは、1 つの属性 (UILabel *label) を持つクラスを宣言し、その後、そのラベルのプロパティを宣言しています。

いいえ、違います。最初のケースでは、呼び出されるインスタンス変数と and と呼ばれるアクセサ メソッドのペアを宣言しています(labelまとめてプロパティとして知られています)。プロパティとインスタンス変数の間にリンクが確立されていません。この時点で、それらは独立したエンティティです。-setLabel:-label

実装でこれを行う場合:

@synthesize label = fooBar;

label プロパティのメソッドは、実際にはまったく異なるインスタンス変数を使用してプロパティをサポートしていると言っています。

クラス属性を宣言する必要があるといつも思っていました

私も同じことを考えていましたが、実際には、プロパティを合成している場合、ivar を個別に宣言しても意味がありません。@synthesize がそれを実行してくれるからです (ARC では正しい所有権修飾子が適用されます)。私は今、次のようなことをしています:

 @synthesize label = label_;

そのため、プロパティを使用する場合はインスタンス変数を使用しません。たとえば[label length]、意図したときにエラーをフラグします[[self label] length]

また、インスタンス変数を使用しないようにプロパティの実装を変更した場合、インスタンス変数を明示的に宣言していない場合、インスタンス変数はなくなり、偶発的な使用 (+ および 内のものinit)deallocはエラーとしてフラグが立てられます。

于 2012-05-31T09:56:39.547 に答える
0

言及されていない別の違い:

最初のケースでは、labelアクセスが保護されています。@protectedインスタンス変数は、特に宣言されていない限り、デフォルトで使用されます。

一方、2番目のケースでlabelは、プライベートです(少なくとも私のコンパイラでは)。

この違いは、サブクラスがある場合に重要になります。

于 2012-05-31T19:14:34.103 に答える