iOS -類目,延展,協議

來源:互聯網
上載者:User

標籤:blog   class   ext   int   http   c   

 

1.類目

 

類目就是為已存在的類添加新的方法。但是不能添加執行個體變數。比如系統的類,我們看不到他的.m檔案,所以沒有辦法用直接添加方法的方式去實現。

 

@interface NSMutableArray (Sort) //為NSMutableArray類添加Sort方法,Sort就是類目名,做到見名知意
-(void)invert;//方法
@end

 

實現部分

 

#import "NSMutableArray+Sort.h"
@implementation NSMutableArray (Sort)
-(void)invert
{
    NSUInteger count = self.count;
    for (int i = 0; i<count/2; i++)
    {
        [self exchangeObjectAtIndex:i withObjectAtIndex:count-i-1];//第一個對象和最後一個對象交換
    }
}
@end

 

在主函數裡邊可以直接調用上邊的invert方法

 

 NSMutableArray * arr = [[NSMutableArray alloc]initWithObjects:@"12",@"4",@"89",@"88",@"36", nil];    
 [arr invert];    
 NSLog(@"%@",arr);

 

列印結果:

 

2012-08-13 11:12:03.324 類目[980:14503] (
    36,
    88,
    89,
    4,
    12
)

 


Category的使用情境有那些呢:
1、類包含了很多個方法實現,而這些方法需要不同團隊的成員來實現
2、當你在使用基礎類庫中的類時,你不想繼承這些類而只想添加一些方法時。
 
Category能實現上面的需求,當然也有使用Category是需要注意的問題:
1、Category可以訪問原始類的執行個體變數,但不能添加執行個體變數,如果想添加變數,那就通過繼承建立子類來實現。
2、Category可以重載原始類的方法,不大不推薦這麼做,這樣會覆蓋掉原始類的方法。如果確實要重載,那就通過繼承建立子類來實現。
3、和普通介面有所區別的是,在Category的實現檔案中的執行個體方法只要你不去調用它你可以不用實現所有聲明的所有方法。

 

2.延展

 

延展的作用就是定義自己的私人方法。

 

形式和類目相同,不用新建立檔案,只是把類目的interface地方的檔案放在了你需要擴充的類的.m檔案裡邊。

 

#import "Student.h"
@interface Student (extension)//為Student類建立一個私人的方法text
-(void)text;
@end

@implementation Student
-(void)hello;
{
    [self  text];
}

-(void)text
{
    NSLog(@"你好");
}
@end

外界  [student hello]的時候就會列印出“你好”。但是在外界不能調用text方法,[student text]是不對的。只能在.m檔案裡邊通過self來調用私人方法text。隱藏了內部的實現。

 

3.協議

 

(1).協議聲明了可以被其他的類實現的方法。協議本身必不會去實現。

 

(2).協議不是類,只是一個其他對象可以實現的介面。

 

定義一個協議:

 

#import <Foundation/Foundation.h>
@protocol MarryProtocol <NSObject>//定義一個結婚協議,結婚協議也可以繼承其它的協議。
@required   //必須遵守的協議,在遵守MarryProtocol協議的類的.m檔案中去實現裡邊的方法。
- (void)washClothes;
- (void)cook;
@optional  //可選的協議
- (void)makeMoney;
@end

 

代理(委託)模式:自己有需求,但是讓別人去做。

 

定義一個Men類

 

#import <Foundation/Foundation.h>
#import "RoomService.h" 
@interface Men : NSObject
@property(nonatomic,retain)NSString * name;
@property(nonatomic,assign)id<MarryProtocol> mate;//定義一個代理
-(id)initWithName:(NSString *)name;
-(void)needEat;
@end

 

定義一個Women類

 

#import <Foundation/Foundation.h>
#import "MarryProtocol"
@interfaceWomen : NSObject <MarryProtocol>  //遵守協議
@property(nonatomic,retain)NSString * name;
-(id)initWithName:(NSString *)name;
@end

 

在Men的實現裡邊

 

-(void)needEat
{
    [self.mate  cook];
}

 

在Women的實現裡邊有一個方法

 

-(void)cook

 

{

 

      NSLog(%@"wonmen正在做飯");

 

}

 

主函數裡邊

 

men.mate = women;

 

[men needEat];

 

列印出:wonmen正在做飯

 

4.協議也可以寫在一個類裡邊,用到的時候引入類的標頭檔就可以。

 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.