2

Objective-C プログラミング言語ドキュメントのプロパティの再宣言の章を読みましたが、次のプロパティの再宣言について明確にしていただける方がいらっしゃいましたらお願いします。

// MyObject.h public header file

@interface MyObject : NSObject {
    NSString *language;
}
@property (readonly, copy) NSString *language;
@end


// MyObject.m private implementation file
@interface MyObject ()
@property (readwrite, copy) NSString *language;
@end

@implementation MyObject
@synthesize language;
@end

@property上記のキーワードと@synthesizeキーワードが次のコードを生成するかどうかを理解したいだけです。

// MyObject.h public header file

@interface MyObject : NSObject {
    NSString *language;
}
-(NSString *)language;
@end


// MyObject.m private implementation file
@interface MyObject ()
-(void)setLanguage: (NSString *) aString;
@end

@implementation MyObject
-(NSString *)language {
    return language;
}

-(void)setLanguage: (NSString *) aString {
    [language release];
    language = [aString copy];
}
@end

そのため、コンパイラは最初の@property宣言を見て、パブリック インターフェイスに getter メソッドを追加します...実装ファイルになると、同じプロパティの別の@property宣言を見つけますが、プライベート インターフェイス内に readwrite 属性があり、ゲッターは既にパブリック インターフェイスに追加されているため、セッター メソッドのみを追加します。その後、@synthesizeキーワードが見つかり、両方の実装がプライベート実装セクションに追加されます。最初の@property宣言の copy 属性は必要ありません。セッターは必要ありませんが、2 番目のプロパティの再宣言と一致するように指定する必要があります。私の考えは正しいですか?

4

1 に答える 1

3

はい、あなたの理解は正しいです。

また、Objective-C には厳密にプライベートなメソッドがないことに注意してください。外部の発信者は引き続き を呼び出すことができますsetLanguage:。コンパイラは警告を出力しますが、メッセージは実行時に表示されます。

于 2011-09-27T08:52:29.197 に答える