Objective-C中類和方法的定義以及協議的使用_IOS

來源:互聯網
上載者:User

類和方法的定義
一般類都是繼承NSObject,建立一個類時父類選擇NSObject即可,oc只有單繼承,沒有多繼承。

下面以一個簡單的oc工程來講解(需配置好Xcode工具以相應的SDK),會建工程的請直接跳到‘六'步驟。

一、建立一個oc編譯環境,開啟xcode->File->New->Project(快速鍵 command+shift+N)。

二、選擇OS X--Application--Command Line Tool,選擇next

三、填寫項目名稱(最好英文),你自己的名字,和公司的標誌。Type選擇Foundation,下面的勾表示是否選擇ARC,建議初學者勾上。點擊next

四、此時工程建好了,會看到一個main.m檔案,所有的調用都在main.m中完成。

建立一個類,command+N,選擇父類NSObject,取名people

五、點擊next之後,出現以下介面,切記下面的√要打上。否則在編譯時間工程搜尋不到此檔案,會出現編譯錯誤。

六、在people.h檔案interface中添加變數,NSString為OC的字串變數。

複製代碼 代碼如下:

@interface Person : NSObject {
    
    NSString * _name;
    int _age;
    
}

然後在{}外面定義變數的初始化方法和set方法,格式:-(類型)方法名:(參數類型)參數1 參數名:(參數類型)參數2……,set方法名一般為set變數名,變數名首字母大寫,此未蘋果官方文檔上的說明
複製代碼 代碼如下:

-(void)setAge:(int)age;
 
-(void)setName:(NSString *)name;

定義變數的get方法,get方法名同樣為get變數名
複製代碼 代碼如下:

-(int)age;
 
-(NSString *)name;

七、在people.m檔案中實現people.h檔案中聲明的方法。
複製代碼 代碼如下:

-(void)setAge:(int)age {
 
    _age = age;
 
}
 
-(void)setName:(NSString *)name {
    _name = [name copy];//copy方法涉及到oc的記憶體管理機制。使用copy可防止記憶體泄露
}

-(int)age {
    return _age;
}
-(NSString *)name {
    return _name;
}


七、在main.m中定義一個people類,並對其屬性變數進行初始化。
定義一個people類:
複製代碼 代碼如下:

Person *dwight = [[Person alloc] init];

給其屬性賦值:
複製代碼 代碼如下:

[dwight setName:@"Dwight Schrute"];
 
[dwight setAge:38];

列印值:

NSLog(@"%@ (%d)", [dwight name], [dwight age]);
PS:一般NSString,NSArray,NSDictionary,NSData等類型的值列印用%@,int等C中的類型,按照C語言列印的關鍵字列印,NSInteger,NSNumber列印時用%d。

列印結果:


protocol協議,設定代理
協議(protocol)是ObjC中很重要的一部分,它用來定義可由任何其他類完成的方法,當本類中需要完成某些功能時,可由protocol來實現
protocol在三種情況中需要用到:

需要聲明別的類期望完成的方法時
在隱藏自身類的情況下聲明該類對象的介面時
在某些沒有繼承關係的類之間擷取其之間的相似性,即兩個類之間沒有繼承關係,但是都需要實現同樣的方法時,就可通過代理來實現。
protocol檔案中只是定義一些方法,當你在類中實現了這個protocol時,你就需要補充這些方法,系統會自動調用這些方法
protocol中方法分為@required和@optional,其中在@required下的方法必須實現,@optional中方法是選擇性實現,也可不實現。

下面以一個簡單一實例說明protocol的用法(OS X下)在iOS下同樣使用

一、建立一個Objective-C class,命名為iOSCoder

①、在iOSCoder@end後面定義一個protocol,命名為MyprotocolDelegate,並聲明@required和@optional方法

②、在#import後聲明@protocol MyprotocolDelegate

③、在interface中聲明屬性@property(nonatomic,assign) id<MyprotocolDelegate>   delegate;


整個.h檔案如下

複製代碼 代碼如下:

#import <Cocoa/Cocoa.h>
 
@protocol MyprotocolDelegate;
 
@interface iOSCoder : NSObject
//聲明delegate屬性
@property(nonatomic,assign) id<MyprotocolDelegate>   delegate;
 
@end

複製代碼 代碼如下:

//定義protocol
@protocol MyprotocolDelegate <NSObject>
//必須實現方法
@required
-(void)StartObjectiveC;
-(void)StartPrograming;
//選擇實現方法
@optional
-(void)StartJavaScript;
-(void)StartPython;
 
@end

二、在需要用到iOSCoder類的檔案中,聲明並進行初始化
如果要用到iOSCoder中的delegate,則必須在.h檔案中進行聲明,聲明格式

@interface 類名:繼承類<MyprotocolDelegate>

定義iOSCoder對象

複製代碼 代碼如下:

iOSCoder *ios = [[iOSCoder alloc] init];
    ios.delegate = self;
    if ([ios respondsToSelector:@selector(StartObjectiveC)]) {
        [self StartObjectiveC];
    }
    if ([ios respondsToSelector:@selector(StartPrograming)]) {
        [self StartPrograming];
    }

實現required方法
複製代碼 代碼如下:

-(void) StartObjectiveC
{
    NSLog(@"@required,StartObjectiveC");
}
-(void)StartPrograming
{
    NSLog(@"@required,StartPrograming");
    
}

附:在iOS ViewController中使用時

假設A要跳轉到B頁面時需要在B頁面中實現A中的protocol方法

.h檔案

複製代碼 代碼如下:

#import <UIKit/UIKit.h>
@class AViewController;
@protocol ADelegate <NSObject>
 
- (void) AMethod
 
@end

複製代碼 代碼如下:

@interface AViewController : UIViewController
{
     id<ADelegate> _delegate;
    
}
@property(nonatomic,assign)id<ADelegate> delegate;
@end

在頁面跳轉之前加上
複製代碼 代碼如下:

if (_delegate && [_delegate respondsToSelector:@selector(AMethod)]) {
          [_delegate AMethod];
     }

在B頁面中聲明代理<ADelegate>,實現AMethod方法,執行個體化A對象,並設定代理
則在B介面會調用AMethod方法,即完成了protocol的實現

相關文章

聯繫我們

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