2015-02-06 160 views
2

我想創建NSNotification的子類。 我不想創建一個類別或其他任何東西。繼承自NSNotification

正如你可能知道NSNotification類簇,像NSArrayNSString

我知道,集羣類的子類需要:

  • 聲明自己的存儲
  • 覆蓋超
  • 覆蓋的所有初始化方法超類的原始方法(如下所述)

這是我的子類(沒有什麼幻想):

@interface MYNotification : NSNotification 
@end 

@implementation MYNotification 

- (NSString *)name { return nil; } 

- (id)object { return nil; } 

- (NSDictionary *)userInfo { return nil; } 

- (instancetype)initWithName:(NSString *)name object:(id)object userInfo:(NSDictionary *)userInfo 
{ 
    return self = [super initWithName:name object:object userInfo:userInfo]; 
} 
- (instancetype)initWithCoder:(NSCoder *)aDecoder 
{ 
    return self = [super initWithCoder:aDecoder]; 
} 

@end 

當我使用它,我得到一個非凡:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** initialization method -initWithName:object:userInfo: cannot be sent to an abstract object of class MYNotification: Create a concrete instance!' 

還有什麼我必須爲了從NSNotification繼承呢?

+0

不要調用超類初始化 - 例如 - 請參見[如果我想添加類型化屬性,請將NSNotification的子類化爲正確路由](http://stackoverflow.com/questions/7572059/is-subclassing -nsnotification-the-right-route-if-i-want-to-add-typed-properties) – Paulw11 2015-02-06 01:21:41

+0

感謝您的迴應!這就是我一直在尋找的! – 7ynk3r 2015-02-06 01:45:10

回答

1

問題在於試圖調用超類初始化程序。你不能這樣做,因爲它是一個抽象類。因此,在初始化程序中,您只需啓動存儲。

因爲這太可怕了,我最終創建了NSNotification的類別。在那裏,我加入了三種方法:

  • 我的自定義通知靜態構造函數:在這裏,我配置userInfo用作存儲。
  • 將信息添加到存儲的方法:通知觀察者將調用此方法更新userInfo
  • 處理觀察者提交的信息的方法:post方法結束後,通知已收集到所需的所有信息。我們只需要處理它並返回它。如果您對收集數據不感興趣,這是可選的。

最後,該類別只是幫助處理userInfo

謝謝@Paulw11您的評論!