object-c中的類目,延展,協議,object-c類目

來源:互聯網
上載者:User

object-c中的類目,延展,協議,object-c類目

協議
協議只有方法的聲明(類似於其他程式設計語言的介面) 協議相當於大家都所遵循的關鍵字 @protocol 協議名 <所遵循的協議> 預設NSObject @end  @protocollamcoProtocol <NSObject>
@required //必須實現的方法
-(void)study;

@optional //可實現可不實現的方法
-(void)work;@end student.h檔案#import<Foundation/Foundation.h>#import"lamcoProtocol.h"@interfaceStudeny :NSObject<lamcoProtocol,bank>

@end  student.m檔案#import"Studeny.h"
@implementationStudeny
-(void)study{
   NSLog(@"%s",__func__);
}
//-(void)work{
//    NSLog(@"%s",__func__);//}@end 主函數:#import<Foundation/Foundation.h>
#import"Studeny.h"#import"OtherStudent.h"intmain(intargc,constchar* argv[]) {
   @autoreleasepool{
       Studeny*stu=[[Studenyalloc]init];
       
//        [stu study];        //判斷其是否遵循協議       if([stuconformsToProtocol:@protocol(lamcoProtocol)]) {
           //判斷協議是否有該方法
           if([sturespondsToSelector:@selector(study)]){
                [stustudy];
//                [stu work];
            }else{
               NSLog(@"找不到好工作");
            }
        }else{
           NSLog(@"沒有參加培訓");
        }
       
       if([stuconformsToProtocol:@protocol(lamcoProtocol)]){
           if([sturespondsToSelector:@selector(giveMoney)]) {
               NSLog(@"每月還錢");
            }else{
               NSLog(@"成為黑戶");
            }
        }else{
           NSLog(@"不關事");
        }
       
       
       
    }
   return0;}  
延展
為類建立了私人方法,實現一對多1個.m對應多個.h檔案就是說一個類的 .m檔案可以有多個延展的.h檔案 延展可以進行成員變數,屬性,方法的各種操作 延展檔案MyClass_add.h
#import"MyClass.h"

@interfaceMyClass()
-(void)add;@end 類檔案:Myclass.h#import<Foundation/Foundation.h>

@interfaceMyClass :NSObject
-(void)select;

@end Myclass.m #import"MyClass.h"
@implementationMyClass
-(void)select{
   NSLog(@"%s",__func__);
}
-(void)add{
   NSLog(@"%s",__func__);
}@end  主函數 main.m #import<Foundation/Foundation.h>#import"MyClass.h"//到匯入延展的標頭檔#import"MyClass_add.h"

intmain(intargc,constchar* argv[]) {
   @autoreleasepool{
       MyClass*class=[[MyClassalloc]init];
        [classselect];
        [classadd];
   
    }
   return0;}     
分類(類目)
1.不能在分類中添加屬性,只能添加方法2.如果再分類裡面使用@property,那麼它只能產生getter和setter的聲明,沒有實現3.如在在分類中寫了與本類同名的方法,優先調用分類裡面的方法,所以在分類中定義類的時候,盡量避免和本類中的方法重名4.在分類裡面可以訪問本類裡面所定義的屬性  例子:目錄

主函數main.m

#import<Foundation/Foundation.h>

#import"NSString+CategoryNSString.h"

 

intmain(intargc,constchar* argv[]) {

   @autoreleasepool{

       NSString*str=@"abc";

        NSLog(@"%@", [str Reverser]);

        NSLog(@"%d",[str leng].intValue);

    }

   return0;

 }  類目檔案:NSString+CategoryNSString.h

#import<Foundation/Foundation.h>

@interfaceNSString (CategoryNSString)

-(NSString*)Reverser;

-(NSNumber*)leng;

 @end 類目檔案:NSString+CategoryNSString.m 

#import"NSString+CategoryNSString.h"

 

@implementationNSString (CategoryNSString)

/**

 * 字串反轉函數

 *

 *  @param string傳入的字串

 *

 *  @return逆序後的字串

 */

-(NSString*)Reverser{

   NSMutableString*str=[NSMutableStringstring];

   for(unsignedlongi=(self.length); i>0; i--) {

        [strappendFormat:@"%c",[selfcharacterAtIndex:i-1]];

    }

   returnstr;

}

/**

 * 把字串長度int類型變成NSNumber類型

 *

 *  @param string出入的字串

 *

 *  @return NSNumber,字串的長度

 */

-(NSNumber*)leng{

   NSNumber*num=[[NSNumberalloc]initWithUnsignedLong:self.length];

   returnnum;

    

}

 @end  類目的最佳化把所有的分類都放到一個分類中MyClass.h#import<Foundation/Foundation.h>

@interfaceMyClass :NSObject
-(void)Select;
@end
@interfaceMyClass (CategoryUpdate)
-(void)update;
@end

@interfaceMyClass (CategoryAdd)
-(void)add;
@end

@interfaceMyClass (CategoryDeleta)
-(void)delect;@end MyClass.m檔案#import"MyClass.h"  @implementationMyClass
-(void)Select{
   NSLog(@"%s",__func__);
}@end MyClass+CategoryAdd.m檔案 #import"MyClass.h"

@implementationMyClass (CategoryAdd)
-(void)add{
   NSLog(@"%s",__func__);
   
}@end MyClass+CategoryUpdate.m檔案#import"MyClass.h"

@implementationMyClass (CategoryUpdate)
-(void)update{
   NSLog(@"修改");
}@end MyClass+CategoryDeleta.m檔案#import"MyClass.h"

@implementationMyClass (CategoryDeleta)
-(void)delect{
   NSLog(@"刪除");
}@end總結:1.為了避免更多的代碼,和類目的擴充,把類目的.h檔案中全部放在要擴充的類中,並且把他們對應的.h檔案刪除 2.第二步把類目中相之對應的.m檔案,把他們的#import"MyClass+CategoryDeleta” 全部改成本來的類 如:#import "MyClass.h" 就可以了 #import ,@class ,#include三者之間的區別 #import是Objective-C匯入標頭檔的關鍵字,#include是C/C++匯入標頭檔的關鍵字,使用#import標頭檔會自動只匯入一次,不會重複匯入,相當於#include和#pragma once;@class告訴編譯器某個類的聲明,當執行時,才去查看類的實現檔案,可以解決標頭檔的相互包含;#import<>用來包含系統的標頭檔,#import””用來包含使用者標頭檔。@class就是兩個類之間的相互引用 @class的作用是告訴編譯器,有這麼一個類,用吧,沒有問題@class還可以解決迴圈因愛的問題,例如A.h中匯入了B.h,而B.h匯入了A.h,每一個標頭檔的編譯都要讓對象先編譯成功才行,使用@class就可以避免這種情況的發生 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.