objective-c 类目(Category)和延展(Extension)
類目的基本概念:
如果有封裝好的一個類,隨著程序功能的增加,需要在類中增加一個方法,那我們就不必在那個類中做修改或者再定義一個子類,只需要在用到那個方法時添加一個該類的類目即可.
1.在類目定義的方法中,會成為原始類的一部分,與其他方法的調用沒有區別
2.通過給父類定義類目方法,其子類也會繼承這些方法.如果子類添加類目方法,父類則不會擁有子類的類目方法.
類目方法的應用:
對現有類的擴展:在類目中增加的方法會被子類所繼承,而且運行時跟其他的方法沒有區別
作為子類的替代手段:不需要定義和使用一個子類,你可以通過類目直接向已有的類里增加方法
對類中的方法歸類:利用category把一個龐大的類劃分為小塊來分別進行開發,從而更好的對類中的方法進行更新和維護
類目方法的局限性:
無法向類目中,添加新的實例變量,類目沒有位置來容納實例變量,如果想增加類的實例變量,只能通過自定義子類的方式
若在類目中覆蓋現有類的方法,這樣會引起super消息的斷裂,因為類目中的方法具有更高優先級,一般不要覆蓋現有類中的方法
類目的命名與用法:
類目的命名規則:類名+擴展方法(在創建的時候,系統會自動填寫類名,自己只需要寫方法名稱就好)
類目的接口聲明與類的定義十分相似,但類目不繼承父類,只需要帶有一個括號,表明該類目的主要用途
?
延展的基本概念:
類的延展就如同匿名的類目,延展中聲明的方法在類本身的@implementation和對應的@end之間實現
類有時需要方法只有自己所見,我們可以通過延展的方式定義類的私有方法
?
類目的實現可以通過創建一個類目來實現,當然我們也可以直接在要添加的類中的.h直接寫入類目
?
示例代碼:
Computer.h
#import <Foundation/Foundation.h>@interface Computer : NSObject@property(nonatomic,copy)NSString *name;@end@interface Computer (printf) //直接添加了類目 -(void)printf;@end//可以在.h中創建多個類目 /*@interface <#class name#> (<#category name#>)@end*/Computer.m
#import "Computer.h" //延展 //在這里寫私有的方法和變量,當然方法可以直接寫到@implementation中,但是在這里寫了后方便日后的查找 @interface Computer ()@end@implementation Computer-(id)init{if (self = [super init]) {_name = [[NSString alloc]init];}return self; }@end@implementation Computer (printf)-(void)printf{NSLog(@"%@",_name); }@end
Computer+Creation.h
#import "Computer.h"@interface Computer (Creation)-(void)state;@endComputer+Creation.m
#import "Computer+Creation.h"@implementation Computer (Creation)-(void)state{NSLog(@"游戲中"); } @endmain.m
#import <Foundation/Foundation.h> #import "Computer.h" #import "Computer+Creation.h" int main(int argc, const char * argv[]) {@autoreleasepool {// insert code here...NSLog(@"Hello, World!");Computer *computer = [[Computer alloc]init];[computer state];computer.name = @"mac";[computer printf];}return 0; }輸出結果:
2013-12-31 11:50:29.514 類目和延展[1378:303] Hello, World! 2013-12-31 11:50:29.515 類目和延展[1378:303] 游戲中 2013-12-31 11:50:29.516 類目和延展[1378:303] mac?
?
明天復習下協議和代理,把基本概念搞清楚
?
轉載于:https://www.cnblogs.com/mo-shou/p/3499084.html
總結
以上是生活随笔為你收集整理的objective-c 类目(Category)和延展(Extension)的全部內容,希望文章能夠幫你解決所遇到的問題。