1

以下の例では、なぜセッターがmyStringのために合成されていませんか?以下の基本的な割り当ては、myStringnilになります。セッター[self setMyString:s];を使用しようとすると、認識できないセレクタ例外が発生します。目的関数-cのシャドウイングに関する問題

// in .h file 
@interface MyClass 
@property (nonatomic, readonly) NSString *myString; 
@end 

// in .m file 
@interface MyClass (MyCategory) 
@property (nonatomic, copy) NSString *myString; 
@end 

@implementation MyClass 
@synthensize myString; 

- (void) someMethod:(NSString *) s { 
    myString = [s copy]; 

    // why is myString nil here? 
} 

@end 

編集:問題は、GDBとありました。 po myStringが印刷されたCan't print description of a NIL object.。しかし、NSLog(@"myString: %@", myString);が期待値を出力しました。

答えて

4

他の2つの答えは正しいですが、私は彼らがあなたの意図を逃すと思います。 .hファイルでプロパティを読み取り専用として宣言するのは一般的です。そのため、クラス実装の外部にあるコードでは書き込めません。 .mファイルの中で、そのファイルを読み書きします。この種の再定義はであり、明示的にはをサポートしています。ただし、クラスの拡張で読み書きとして再宣言を置く必要があります。

// In your .h file: 
@interface MyClass : NSObject 
    @property (nonatomic, copy, readonly) NSString *myString; 
@end 

// In your .m file: 
@interface MyClass() // Note the empty parentheses 
    @property (nonatomic, copy, readwrite) NSString *myString; 
@end 

あなたはまだ代わりに、あなたが今やっているとして直接IVARへの書き込み、self.myString = aStringまたは[self setMyString:aString]を使用する必要があります。

+0

私はこれについて知りませんでした。それは便利になるかもしれないように見えます。あなたはそれが明示的にサポートされていると言います - それのためのドキュメントへのリンクがありますか?前もって感謝します。 –

+0

@Will:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW19 –

+0

@WillPragnell [拡張機能](https://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/chapters/occategories.html)。 *クラス拡張の一般的な用途は、公開されているものとして公開されているものを再読み込みすることです。* – Caleb

1

MyClassインターフェイスとMyCategoryカテゴリの両方で同じ名前のプロパティを宣言することは悪い考えです。カテゴリの宣言を削除し、すべてがうまくいくと思います。

+3

私は、OPが公開専用の非公開の読み書き可能なプロパティを作成しようとしていると思います。 – mipadi

+1

はいそれが正しいです – SundayMonday

+1

@mipadi私は同意し、あなたの答えは正しく行う方法を示しています。 – Caleb

4

公開されているだけの、私的に書き込み可能なプロパティを宣言しようとしているようです。その場合はカテゴリではなくで行う必要があります。構文的には、クラス拡張は、名前のないカテゴリのようになります。

@interface MyClass() 
@property (nonatomic, copy) NSString *myString; 
@end 
関連する問題