中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

協議protocol和代理delegate的使用

發布時間:2020-07-07 05:49:09 來源:網絡 閱讀:606 作者:Im劉亞芳 欄目:開發技術

這里的協議是獨立的,不再類里面,所以每個類的頭文件都要引入#import "MarryProtoco.h"頭文件。。

首先新建一個協議 Protocol:MarryProtoco 里面寫代理人要執行的方法,或者可選方法

#import <Foundation/Foundation.h>
@protocol MarryProtoco <NSObject>
//代理人中必須要執行的 。
//做飯
- (void)cook;
//洗衣服
- (void)washCloth;
//看孩子
- (void)lookAfterChild;
//代理人中可選執行的
@optional
//交朋友
- (void)makeFriend;
@end


然后在新建一個老大類,老大類就這讓代理人執行方法的類--這里新建的是Boy類

Boy.h文件代碼

#import <Foundation/Foundation.h>
#import "MarryProtoco.h"   //Boy引入協議
@interface Boy : NSObject
{
    NSString *_name;
//    id<MarryProtoco> _delegate;
}
@property (nonatomic , copy)NSString *name;
@property (nonatomic , assign)id<MarryProtoco> delegate;//這里因為是id類型的,所以用assign,并且這里只能上面id<MarryProtoco> _delegate;同時存在一者,否則會報錯。
- (instancetype)initWithName:(NSString *)name;   //代理人是在老大里面設置的
//- (void)setDelegate:(id<MarryProtoco>)delegate;
- (void)work;
- (void)eat;
- (void)play;
@end

Boy.m文件代碼

#import "Boy.h"
@implementation Boy
@synthesize name = _name;
- (instancetype)initWithName:(NSString *)name  // 這里這樣寫是不對的,因為在.h中name是copy類型,如果這樣寫話是assign類型的寫法。應該改成注釋后的寫法
{
    self = [super init];
    if (self) {
        //_name = name;
        [self setName:name];    //這個才是copy類型變量的寫法。。。。可懂?
    }
    return self;
}
- (void)setDelegate:(id<MarryProtoco>)delegate
{
    _delegate = delegate;
}
- (void)work
{
    NSLog(@"%@我要去工作了,早點在家做飯,", _name);
    [_delegate cook];
}
- (void)eat
{
    NSLog(@"%@,我要出去吃飯了,你在家給我好好看孩子", _name);
    [_delegate lookAfterChild];
}
- (void)play
{
    NSLog(@"%@,我要出去玩耍,這些衣服臟了,怎么辦?",_name);
    [_delegate washCloth];
}
@end

創建代理類Girl,來執行協議中的方法

Gril.h文件代碼

#import <Foundation/Foundation.h>
#import "MarryProtoco.h"   //Gril引入協議
@interface Girl : NSObject<MarryProtoco>
{
    NSString *_name;
   
}
@property (nonatomic , copy)NSString *name;
- (instancetype)initWithName:(NSString *)name;
//代理人必須執行協議里面的全部方法即MarryProtoco里面的方法
//代理人中@optional里面的方法是可選的,可以執行也可以不執行。
- (void)cook;
- (void)lookAfterChild;
- (void)washCloth;
@end

Gril.m文件代碼

#import "Girl.h"
@implementation Girl
@synthesize name = _name;
- (instancetype)initWithName:(NSString *)name
{
    self = [super init];
    if (self) {
        //_name = name;
        [self setName:name];
    }
    return self;
}
- (void)cook
{
    NSLog(@"%@我去給您做飯,你別急,馬上好", _name);
}
- (void)lookAfterChild
{
    NSLog(@"%@說,好睇,我去看孩子,你去玩吧,玩得開心哦。", _name);
}
- (void)washCloth
{
    NSLog(@"%@說,恩恩,您衣服臟了,我去給你洗洗,嘻嘻,",_name);
}
@end

main.m主函數中的代碼寫法

#import <Foundation/Foundation.h>
#import "Girl.h"
#import "Boy.h"
#import "MarryProtoco.h"
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        /*
         凡事符合系統默認setter、getter書寫格式的方法,都可以使用點語法
         例如:[person setName:@“zhangsan”];
         可以等價寫成 person.name = @“zhangsan”;
         
         NSString *name = [person name];
         可以等價寫成NSString *name = person.name;
         屬性是一對getter、setterfangfa,點語法是屬性的另一種調用格式       
         */
        
//        Girl *mm = [[Girl alloc] initWithName:@"妹妹"];
        Girl *mm = [[Girl alloc] init];
        mm.name = @"妹妹";
//        Boy *gg = [[Boy alloc] initWithName:@"哥哥"];
        
        Boy *gg = [[Boy alloc] init];
        gg.name = @"哥哥";
        [gg setDelegate:mm]; //設置代理人,
        [gg work];
        [gg play];
        [gg eat];
        
        //每次只能存在一個代理人,如果想換代理人,就必須讓現有的死了,然后在設置代理人
    }
    return 0;
}




向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

邢台县| 景宁| 郧西县| 扶沟县| 东乌珠穆沁旗| 浮梁县| 阿尔山市| 葫芦岛市| 桂平市| 蓬安县| 兴隆县| 太湖县| 新巴尔虎左旗| 开远市| 鄂托克前旗| 诸城市| 临城县| 山丹县| 玉溪市| 水富县| 会昌县| 拜城县| 蓬安县| 开封县| 南乐县| 尚义县| 五莲县| 高青县| 曲靖市| 深州市| 广德县| 新干县| 桐柏县| 北流市| 体育| 霍林郭勒市| 黄龙县| 凤城市| 安徽省| 吴桥县| 元朗区|