8

インターフェイス ブロック内で ivar を宣言し、同じプロパティを宣言するコード例 (Beginning iPhone 4 Development の本から) を見てきました。このような:

@interface ViewController : UIViewController {
    UITableView *table;
}

@property (nonatomic, retain) IBOutlet UITableView *table;

これの目的/利点は何ですか?私が理解しているように、最新のランタイム バージョン (iPhone および 64 ビット OS X アプリケーション) では、プロパティを宣言するだけでよく、インターフェイス ブロック内の ivar の宣言を省略することができます。類似スレッドのこの回答によると、デバッグ目的で使用されます。しかし、デバッグ以外に、このアプローチを使用する利点はありますか?

乾杯、

ピーター

4

3 に答える 3

5

ivar を明示的に宣言すると、ivar の特殊な型を内部的に使用できるようになります。

典型的な例は、読み取り専用で不変の方法で外部からアクセスできる、内部的に変更可能なオブジェクトです。

例:

@interface Foo : NSObject
@property (readonly) NSArray *bars;
@end

@implementation
{
    NSMutableArray *bars;
}

@synthesize bars;

- (void)addBar:(Bar *)bar
{
    [bars addObject:bar];
}
@end

もちろん、barsプロパティから返されるオブジェクトは実際には不変ではありません。しかし重要なのは、API がその可変性を明らかにしていないということです。

派手な新しい private-ivars-in-implementation スタイルを使用したことに注意してください。これは、最新のランタイムと clang コンパイラに依存しています。

于 2011-05-23T16:33:04.063 に答える
2

一部のプログラマーは、直接アクセスと KVC アクセスを区別するために、わずかに異なる名前で iVar を定義することを好みます。例えば:

.h で

@interface ViewController : UIViewController {
    UITableView *_table;
}

@property (nonatomic, retain) IBOutlet UITableView *table;

そして.mで

@synthesize table = _table;

この方法では、iVar を使用して直接アクセスし_tableますが、合成されたセッターとゲッターを使用します[self table]

于 2011-05-23T16:37:31.120 に答える
1

しかし、このアプローチを使用するデバッグ以外の利点はありますか?

私はivarsを明示的に宣言します:

  • アクセス制御(可視性)
  • 組織
  • 統一された文体
  • 互換性(ねえ、このプログラムは1日32ビットをサポートする可能性があります)
  • また、プロパティをクラスのパブリックインターフェイスの一部として関連付けるため(これには例外がありますが)、単にクラスのivarへのアクセサーとしてではありません。

「読み取り/書き込みプロパティとしてのすべて」は根本的に欠陥があります。

于 2011-05-23T19:57:12.917 に答える