1

爲什麼在下面的例子中沒有爲myString合成一個setter?以下基本職責myStringnil。試圖使用設置器[self setMyString:s];會導致無法識別的選擇器異常。在objective-c中shadowing @property的問題

// 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

另外兩個答案是正確的,但我認爲他們錯過了你的意圖。通常在.h文件中聲明一個屬性爲只讀屬性,以便類實現之外的代碼不能編寫它。在.m文件中,您希望它是readwrite。這種重新定義是明確支持。但是,你需要把重聲明爲讀寫類中的擴展:

// 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 

你仍然需要使用self.myString = aString[self setMyString:aString],而不是因爲你現在在做書面直接伊娃。

+0

我不知道這件事。看起來它可以派上用場。你提到它是明確支持的 - 你有鏈接到文檔的嗎?提前致謝。 – 2012-02-13 21:30:38

+0

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

+0

@WillPragnell閱讀[擴展](https://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/chapters/occategories.html)。 *類擴展的一個常見用途是重新聲明公開聲明爲只讀的屬性,只讀作爲readwrite ... * – Caleb 2012-02-13 21:34:03

1

在MyClass接口和MyCategory類別中聲明一個具有相同名稱的屬性似乎是一個壞主意。刪除類別中的聲明,我希望一切都會好的。

+3

我認爲OP的嘗試創建一個公開只讀,私人讀寫屬性。 – mipadi 2012-02-13 21:27:18

+1

是的,這是正確的 – SundayMonday 2012-02-13 21:29:20

+1

@mipadi我同意,並且您的答案顯示如何正確執行此操作。 – Caleb 2012-02-13 21:31:51

4

它看起來像你試圖聲明一個公開只讀,私人可寫的屬性。你應該在類擴展而不是類別。從句法上看,類擴展看起來像一個沒有名字的類別:

@interface MyClass() 
@property (nonatomic, copy) NSString *myString; 
@end