一 、類目的基本概念
框架
封裝是面向對象的一個特徵,OC也不例外。可是有的時候咱們會遇到這樣一種狀況,好比封裝一個類,不想再動他了。但是隨着程序的增長,須要在那個類中增長一個小小的方法。這時咱們沒必要再在這個類中作修改,或者定義一個子類。只須要在用到那個方法時,隨手添加一個類目便可。
atom
1)在類目定義的方法會成爲原始類的一部分,與其餘方法的調用沒有任何區別;
spa
2)經過給父類定義類目方法,其子類也會繼承這些方法。若是子類添加類目方法,父類不會繼承子類的類目方法。
code
2、類目方法的應用
對象
1)對現有類進行擴展。好比你能夠擴展Cocoa touch框架中的類,你在類目中增長的方法會被子類所繼承,並且在運行時跟其餘方法沒有區別。
繼承
2)做爲子類的繼承手段不須要定義一個子類,你能夠經過類目直接給已有類增長方法。
接口
3)對類中的方法歸類,利用category把一個龐大的類劃分紅小塊來分別進行開發。從而更好的對類進行更新和維護。開發
3、類目方法的侷限性it
1)沒法向類目中添加新的實例變量。類目沒有位置來容納實例變量。若是想增長類的實例變量,只能經過子類來實現。io
2)如若,在類目中覆蓋現有類的方法。這樣會引發super的消息斷裂,由於類目中的方法具備更高的優先級。所以,通常不要覆蓋現有類的方法。
4、類目的命名與用法
類目的命名規則:類名+擴展方法,如"NSString+Revert"
類目的接口聲明與類的定義方法相似,但類目不繼承父類,只須要帶有一個括號,代表該類的主要用途。
#import <Foundation/Foundataion.h> //.h 類目的定義 @interface NSString (Revert) - (void)test; @end |
#import <Foundation/Foundataion.h> //.m 類的定義 @interface Revert:NSObject - (void)test; @end |
#import "NSString+Revert.h" //.h 類目方法的實現 @implementation NSString (Revert) - (void)test; @end |
#import "Revert.h" //.m 類中方法的實現 @implementation NSString (Revert) - (void)test; @end |
5、相關代碼以下:
// // person.h // Category // // Created by moki on 14-8-4. // Copyright (c) 2014年 Santai. All rights reserved. // #import <Foundation/Foundation.h> @interface person : NSObject { @private NSString *_name; int _age; } @property (nonatomic,copy) NSString *name; @property(nonatomic) int age; - (void)test; - (void)eat; @end @interface person (creation) + (id)personWithName:(NSString *)aName; + (id)personWithName:(NSString *)aName withAge:(int)age; //... - (id)initWithname:(NSString*)aName; - (id)initWithname:(NSString *)aName withAge:(int)age; @end @interface person (life) //- (void)eat; - (void)sleep; - (void)play; @end |
// // person.m // Category // // Created by moki on 14-8-4. // Copyright (c) 2014年 Santai. All rights reserved. // #import "person.h" @implementation person @synthesize name=_name; @synthesize age=_age; - (void)test { NSLog(@"這是類的一個方法"); } - (void)eat { NSLog(@"他在吃"); } @end @implementation person (creation) + (id)personWithName:(NSString *)aName { person *pson = [[person alloc] init]; pson.name = aName; return pson; } + (id)personWithName:(NSString *)aName withAge:(int)age { person *pson = [[person alloc] init]; pson.name = aName; pson.age=age; return pson; } - (id)initWithname:(NSString*)aName { self=[super init]; if(self) { self.name=aName; } return self; } - (id)initWithname:(NSString *)aName withAge:(int)age { self=[super init]; if(self) { self.name=aName; self.age=age; } return self; } @end @implementation person (life) /*- (void)eat { NSLog(@"這是類目的eat方法"); }*/ - (void)sleep { NSLog(@"這是類目的sleep方法"); } - (void)play { NSLog(@"這是類目的play方法"); } @end |