Objective-C中的類目和延展

類目:爲已知的類增加新的方法;延展:通知在本類的定義裏使用類目來聲明私有方法;

一、類目:

1. 類目方法的應用:

  • 對現有類進行擴展:比如:可以擴展Cocoa touch框架中的類,在類目中增加的方法會被子類繼承,而且在運行時跟其他的方法沒有區別。
  • 作爲子類的替代手段:不需要定義和使用一個子類,可以通過類目直接向已有的類裏增加方法。
  • 對類中的方法歸類:利用catigory把一個龐大的類劃分爲小塊來分別進行開發,從而更好地對類中的方法進行更新和維護。

2. 類目方法的侷限性:

  • 無法向類目中添加新的實例變量,類目沒有位置來容納實例變量。如果想增加類的實例變量,只能通過定義子類的方式。
  • 如若,在類目中覆蓋先後類的方法。這樣會引起super消息的斷裂,因爲類目總的方法具有更高的優先級,因此,一般不要覆蓋現有類中的方法。

3.類目的定義:

      類目的命名規則:類名+擴展方法,如“NSString+Revert”。 類目的接口聲明與類的定義十分相似,但類目不繼承父類,只需要帶有一個括號,表明該類目的主要用途。

NSString+Revert.h文件:

#import <Foundation/Foundation.h>

@interface NSString (Revert)

- (void)test;

@end
NSString+Revert.m文件:

#import "NSString+Revert.h"

@implementation NSString (Revert)

- (void)test{
}

@end

二、延展:

類的延展可以看作是一種匿名的類目,類有時需要一些只爲自己所見,所用的私有方法這種私有方法可以通過延展的方式來聲明,延展中定義的方法在類本身的@implementation代碼區域中進行實現。
@interface MyObject : NSObject
 {     
NSNumber *number; }
 - (NSNumber *)number;
 @end @interface MyObject (Setter)
 - (void)setNumber:(NSNumber *)newNumber;
@end
 @implementation MyObject
 - (NSNumber *)number
{     
return number;
 }
- (void)setNumber:(NSNumber *)newNumber
{!//do something
}
@end
        當在定義延展的時候不提供類目名時,延展中定義的方法既被視爲“必須實現”的API在這種情況下,如果方法缺少實現代碼,則編譯器會報警告,此時方法的實現必須出現在類主體的@implementation代碼塊中。



發佈了60 篇原創文章 · 獲贊 12 · 訪問量 40萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章