2016-01-23 16 views
1

我正在爲json數據創建一個模型,我將從Web服務接收並聲明屬性以表示json數組成員數組,我宣佈在Objective-C的幾個屬性自動屬性綜合將不會綜合屬性的'描述',因爲它被讀取在ios中寫入objective-c

@property (nonatomic, strong) NSString *id; 
@property (nonatomic, strong) NSString *channel; 
@property (nonatomic, strong) NSString *description; 
@property (nonatomic, strong) NSURL *urlPrefix; 
@property (nonatomic, strong) NSString *filename; 
@property (nonatomic, strong) NSString *url; 
@property (nonatomic, strong) NSURL *audio_stream; 

編譯器給了一個警告的*說明屬性

自動屬性合成,因爲它是讀寫,但將不會合成屬性「說明」通過另一個屬性合成只讀 這是什麼意思。有什麼我不正確的做法嗎?

+0

@euvs下面的答案是正確的。擴大;在〜1994年將它添加到API中時,'description'方法是一個非常糟糕的決定,我們從此一直在與它共存。將'description'視爲verboten。使用不同的屬性名稱。 – bbum

回答

2

案例1:

因爲NSString *descriptionNSString.hreadonly屬性是隱式聲明。這是自動合成與只讀訪問。如果您想用readWrite進行合成,請手動合成。

您聲明描述爲:

@property (nonatomic, strong) NSString *description; 

這行爲是readWrite類型。

雖然NSString.h聲明描述爲只讀。

@property (readonly, copy) NSString *description; 

如果你仍然想使用descriptionreadWrite那麼請手動合成它YourClassName.m文件。

在.m文件中添加此行。

@synthesize description; 

案例:2

使用其他的另一個名字,然後descriptionreadWrite訪問使用它。

+0

如果答案有幫助,請將其標記爲已接受。所以,其他人也會覺得很有幫助。謝謝 – technerd

+0

'NSString'的'description'屬性聲明與'NSObject'的隨機子類無關。如果OP是「NSObject」的子類,這隻會影響。 – bbum

+0

@bbum:感謝您提供語言的實際行爲。我編輯了答案。謝謝 – technerd

2

添加到technerd的回答,

有兩種方法可以處理這種情況。

1)您可以將屬性從描述重命名爲某個其他屬性名稱。 (如technerd提到的)

2)如果你想要相同的名字,你可以添加@synthesize在子類中創建getter和setter。

我個人比較喜歡第一種方式。

4

我假設你在最終從NSObject繼承的類中定義這些屬性。 NSObject類符合<NSObject>協議,該協議將description屬性定義爲只讀。

@protocol NSObject 
... 
@property(readonly, copy) NSString *description 
@end 

<NSObject>查看文檔:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/index.html#//apple_ref/occ/intfm/NSObject/description

您試圖定義一個讀/寫已經被定義爲只讀在超一流的,因此讓衝突性質。

我建議你使用不同的名稱來避免衝突。