3

これら 2 つのバージョンの実際の違いは次のとおりです。

@interface Foo : NSObject
// A guy walks into a bar.
@property(nonatomic, copy) NSString *bar;
@end

// Implementation file
@interface Foo ()
@property(nonatomic, retain) NSArray *baz;
@end

@interface Foo : NSObject
// A guy walks into a bar.
@public
@property(nonatomic, copy) NSString *bar;

@private
@property(nonatomic, retain) NSArray *baz;
@end

私の理解では、 @property を .m に入れることは、基本的にそれが非公開であることを意味します。私が間違っている場合は修正してください。また、最適な実装はどれですか? それは単なるコーディング スタイル/プラクティスですか?

4

2 に答える 2

6

コンパイラは、知っていることについて警告することができます。

ヘッダーをインポートすると、コンパイラはandFooというメソッドがあることを確認できます。これは、両方を使用できることを意味しますbarsetBar:

[instanceOfFoo setBar:@"some string"];

NSLog(@"%@", [instanceOfFoo bar]);

一方、ヘッダーのみをインポートしたため、コンパイラーはヘッダーしか表示できず、メソッドbazsetBaz:使用可能なものがあることも認識していないため、次のことを行うとコンパイラーが barf します

[instanceOfFoo setBaz:@"some string"];

NSLog(@"%@", [instanceOfFoo baz]);

ただし、これらのプロパティが存在することがわかっている場合は、コンパイラ バーフィングなしでこのように KVC を使用してアクセスできます。

[instanceOfFoo setValue:@"some string" forKey:@"baz"];

NSLog(@"%@", [instanceOfFoo valueForKey:@"baz"]);
于 2012-05-24T22:52:27.990 に答える
1

あなたの理解は正しいです。.m の @interface に @property を配置すると、「プライベート」になります。つまり、@property 宣言を含まない .h を含む別のクラスからそのプロパティにアクセスしようとすると、コンパイラの警告が表示されます。これは、プロパティにアクセスできないという意味ではなく、コンパイラが怒鳴るというだけです。

ベストに関しては、どちらもベストではありません。オブジェクトにとって意味のあるものを実装する必要があります。これには、.h と .m の両方に項目を含めることができます (.m の完全なプロパティを持つ .h でのみ適切に読み取ります)。基本的に、クラス外で @property にアクセスしてはならない場合は、.m に入れます。

于 2012-05-24T22:25:30.620 に答える