2010-03-26 66 views
28

我想使用一個類別在原始類上創建一個方法作爲屬性。Objective-C類別:我可以爲不在我的類別中的方法添加屬性嗎?

A類:

@interface ClassA 
- (NSString*)foo; 
@end 

A級類別

@interface ClassA (Properties) 
- (void)someCategoryMethod; 
@property (nonatomic, readonly) NSString *foo; 
@end 

現在我這樣做的時候,它似乎工作(編輯:也許這是行不通的,它不抱怨,但我看到奇怪),但它給了我警告,因爲我沒有在我的類別實現中綜合屬性。我如何告訴編譯器,因爲原始類爲我合成了屬性,所以一切都很好?

+0

屬性(大部分)只是''-foo'和'-setFoo'方法的糖。您不能在類別中添加任何額外的實例變量,但可以定義這些方法。 @property語法是可選的,但建議(我不知道它是否工作)。 – 2010-03-26 03:38:48

+1

對於任何試圖用支持ivar(在類別中定義)添加屬性的人,請參閱:http://oleb.net/blog/2011/05/faking-ivars-in-objc-categories-with-關聯參考/ – Senseful 2013-06-26 20:23:05

+0

可能的重複[Objective-C:屬性在類別](http://stackoverflow.com/questions/8733104/objective-c-property-in-category) – hfossli 2014-01-16 08:23:56

回答

32

這裏是你得到了警告:

warning: property ‘foo’ requires method '-foo' to be defined - use @synthesize, @dynamic or provide a method implementation

要禁止這種警告,有這個在您的實現:

@dynamic foo;

+0

正是我需要的,謝謝! – 2010-03-26 05:51:00

1

如果在類別的界面中聲明瞭某些內容,則其定義屬於您類別的實現。

+0

但我沒有訪問'ClassA'的來源。假設這是UIKit中的課程,我正在「改進」。 – 2010-03-26 03:43:20

+0

你可能應該創建一個子類,而不是一個類。 – 2010-03-26 03:48:00

+3

如果它是一個子類,則在我無法控制的區域中創建的此類的實例將不具有此代碼和屬性。 – 2010-03-26 03:51:01

相關問題