15

インターフェイスを実装する際、チュートリアルや文献で一般的な方法は、ivar を宣言してから then を設定すること@propertyです@synthesize

@interface MyClass : NSObject {
NSString *myString;
}

@property (nonatomic, retain) NSString *myString;
@end

ただし、明示的な宣言を省略して @property を付けるだけでも同じ効果があります。

@interface MyClass: NSObject {
}

@property (nonatomic, retain) NSString *myString;
@end

では、なぜほとんどの人@propertyは明示的な宣言を使用するのでしょうか? しないのは悪い形ですか?

4

4 に答える 4

15

以前は必要でした。Objective-C ランタイムには 2 つの異なるバージョンがあります。32 ビットのみの「レガシー」ランタイム (古いもの) と 32/64 ビット ランタイム (新しい 32 ビット ランタイムは iOS デバイスでのみ使用され、 iOS シミュレータ)。

これがまだ必要な唯一の場所は、アプリを 32 ビット モード (10.5 または 10.6) で実行している場合だと思います。他のすべての場所 (64 ビット Leopard、64 ビット Snow Leopard、Lion、iOS) では、「自動 ivar 合成」を備えた新しいランタイムが使用され、結果の ivar は「合成された ivar」と呼ばれます。

于 2011-04-05T17:27:20.297 に答える
2

合成インスタンス変数をサポートするプラットフォームもあれば、サポートしないプラットフォームもあります。インスタンス変数を明示的に宣言すると、コードがより多くの場所で有効になります。これは、ごく最近まで完全に必要だったので、人々は今でもそうしています。数年後、彼らはおそらくもういないでしょう。

于 2011-04-05T17:26:01.200 に答える
1

最新バージョンの Xcode (4.2 以降に関するもの) を使用する場合、ヘッダーで iVar を宣言する必要はありません。一般にアクセス可能なものはすべて、プロパティとして宣言する必要があります。

多くの人は、Objective C オブジェクトが実際には C 構造体へのポインターであることを忘れています。そのため、ヘッダーで宣言されている iVar には、.getter と setter を使用して直接アクセスできますmyObject->myPublicIVar。特に非 ARC コードでは、これは非常に危険です。この@privateディレクティブは、->オペレーターを使用して iVar にアクセスすることを防ぎますが、それでもヘッダー ファイルを乱雑にします。@privateより良い方法があるときは意味がありません。

プライベートなものはすべて、.m ファイル内で宣言する必要があります。多くの場合、これには次のようなクラス拡張が必要です。

// The .h file
@interface Foo : NSObject
@property (nonatomic, strong) NSString *myPublicString;
@end


// The .m file
@interface Foo ()
@property (nonatomic, strong) NSString *myPrivateString;
@end

@implementation Foo {
    NSString *myPrivateIVar;
}

// Xcode 4.5 or later will not require these @synthesize
@synthesize myPublicString = _myPublicString;
@synthesize myPrivateString = _myPrivateString;

@end

このような実装は、iVar に基づくパブリック プロパティ、iVar に基づくプライベート プロパティ、およびプライベートな独立 iVar を提供します。@synthesize ディレクティブを含めましたが、最新のツールを使用する必要はありません。

于 2013-10-19T19:22:57.727 に答える
-3

@property はアクセサー メソッドのみを実装し、インスタンス変数自体が存在する必要があります。ivar を無視してみてください。コンパイル時でない場合、実行時に失敗します。

于 2011-04-05T17:17:20.307 に答える