iOS 屬性 代理協(xié)議 Block用法

  • 前言

本文用最基本的界面通訊(傳個(gè)字符串)來舉例子, 傳遞時(shí)要分清楚, 控制器出現(xiàn)的先后順序.(當(dāng)傳遞數(shù)據(jù)時(shí), 下一個(gè)界面都沒有初始化就肯定不行) 協(xié)議和Block不僅可以傳遞數(shù)據(jù), 還可以調(diào)用其他頁面的函數(shù)方法.


屬性傳值

  • 例如:第一頁內(nèi)容, 傳給后一頁
1. 因?yàn)橐獋鬟f給下一頁,  下一頁一定要有一個(gè)儲(chǔ)存的載體, 所以聲明一個(gè)屬性
@interface SecondViewController ()
@property (nonatomic, copy)NSString *string;
@end
2. push下一頁時(shí)候賦值
@implementation FirstViewController
- (void)didClicked:(UIButton *)sender
{
  SecondViewController *svc = [[SecondViewController alloc]init];
  svc.string = @"蘋果"; 
  [self.navigationController pushViewController:svc animated:YES];
}
@end
3. 在下一頁secondViewController.h中就可以打印出來了
@implementation SecondViewController
- (void)viewDidLoad
{
  [super viewDidLoad];
  NSLog(@"%@", self.string)
}
@end
  • 優(yōu)點(diǎn) 最簡單的傳值方法
  • 缺點(diǎn) 只能從前往后傳值

代理協(xié)議

  • 完成協(xié)議傳值大致分6步
    1. 聲明協(xié)議
    2. 聲明屬性 (設(shè)置代理人屬性)
    3. 執(zhí)行協(xié)議方法 (何時(shí)觸發(fā)方法)
    4. 簽協(xié)議 (代理人引頭文件)
    5. 指定代理人 (.delegate = self)
    6. 實(shí)現(xiàn)方法
  • SecondViewController.h
//在SecondViewController.h中
//聲明協(xié)議和代理人的屬性
@protocol secondViewControllerDelegate <NSObject>//第1步
-(void)passString:(NSString *)string;
@end
@interface secondViewController : UIViewController
//必須是assign,其他會(huì)有循環(huán)引用問題
@property (nonatomic, assign)id<secondViewControllerDelegate>delegate;//第2步
@end

//在SecondViewController.m中
@implementation secondViewController
-(void)ViewDidLoad
{
  //第3步  這個(gè)是控制何時(shí)觸發(fā)協(xié)議方法的,當(dāng)程序走到這行代碼時(shí),程序會(huì)跳轉(zhuǎn)到代理人界面,調(diào)用代理人頁面下的協(xié)議方法
  [self.delegate passString:@"蘋果"];
}
@end
  • FirstViewController.m
// 引頭文件和簽協(xié)議(必須得有這兩步)//第4步
@interface FirstViewController ()< secondViewControllerDelegate >
@end
@implementation FirstViewController
-(void)ViewDidLoad
{
SecondViewController *vc = [[SecondViewController alloc]init];
vc.delegate = self;//第5步
//設(shè)置的代理人必須是當(dāng)前的VC!!!!!!!!!!!!!!!!!!!!
}
-(void)passString:(NSString *)string//第6步  實(shí)現(xiàn)協(xié)議方法
{
    UITextField *textField = [[UITextField alloc]init];
    textField.text = string;//這時(shí)string參數(shù)就是傳過來的"蘋果"
}
@end
  • 優(yōu)點(diǎn): 好理解, 最常用的一種設(shè)計(jì)模式, 可以解決代碼的耦合性
  • 缺點(diǎn): 寫的麻煩

Block傳值

(1). block的寫法及分類
  • Block的寫法: 返回值類型(^起個(gè)名字)(參數(shù)類型, 參數(shù)類型 *) = ^(參數(shù)類型, 參數(shù)類型 *){具體實(shí)現(xiàn)的方法};
  • Block的四種類型的定義
    • 1.無參數(shù)無返回值
       void(^block1)(void) = ^(void){...};
    
    • 2.有參數(shù)無返回值
        void(^block2)(int age, NSString *string) = ^(int age, NSString *string)  {...};
    
    • 3.有返回值,無參數(shù)
      int (^block3)(void) = ^(void){ return 3; }
    
    • 4.有返回值,有參數(shù)
       NSInteger (^block4)(NSInteger *) = ^(NSInteger num) { return num; };
    
(2).Block傳值
  1. 傳值頁面聲明block屬性
//在想要回傳的界面中定義,block必須用copy來修飾(*注:SecondViewController.h中聲明)
//@property (nonatomic, copy)NSArray *(^Block)(NSString *string);后面必須兩個(gè)括號
@property (nonatomic, copy)void(^Block)(NSString *string);
  1. 傳值頁面調(diào)用block, 把"蘋果"傳過去
這個(gè)就相當(dāng)于屬性的get方法, 會(huì)執(zhí)行- (void(^)(NSString *))Block
self.Block(@"蘋果"); 
//當(dāng)程序走到這行代碼時(shí),  程序會(huì)自動(dòng)跳轉(zhuǎn)到block內(nèi)部, 執(zhí)行下面的方法
  1. 被傳值的頁面block參數(shù)就會(huì)有值了
//初始化一個(gè)secondVC對象
SecondViewController *secondVC. = [[SecondViewController alloc]init];
這個(gè)就相當(dāng)于屬性的set方法 會(huì)走 - (void)setBlock:(void(^)(NSString *))Block
secondVC.Block = ^(NSString *string)
{
        firstVC.label.text = string;
      // 這時(shí)string這個(gè)參數(shù)就是"蘋果"了
};
//Block與屬性區(qū)別,  就是可以將代碼當(dāng)參數(shù),  后期調(diào)用block時(shí), 被保存的代碼就會(huì)執(zhí)行, 跟協(xié)議傳值大同小異

//關(guān)于block的內(nèi)存問題
//1.如果要使用block作為一個(gè)屬性, 必須用copy
//2.為了防止循環(huán)引用, 可以用弱指針代替
//ARM寫法: __weak typeof( 類型 *) weakSelf = self;
//MRC寫法: __ block typeof( 類型 *) weakSelf = self;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卦碾,一起剝皮案震驚了整個(gè)濱河市珠漂,隨后出現(xiàn)的幾起案子燕雁,更是在濱河造成了極大的恐慌侨拦,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冶共,死亡現(xiàn)場離奇詭異窟勃,居然都是意外死亡斗搞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門叶眉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來址儒,“玉大人,你說我怎么就攤上這事衅疙∥鹆В” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵攘滩,是天一觀的道長咐旧。 經(jīng)常有香客問我,道長理朋,這世上最難降的妖魔是什么絮识? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮嗽上,結(jié)果婚禮上次舌,老公的妹妹穿的比我還像新娘。我一直安慰自己兽愤,他們只是感情好彼念,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著浅萧,像睡著了一般逐沙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洼畅,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天吩案,我揣著相機(jī)與錄音,去河邊找鬼帝簇。 笑死徘郭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的丧肴。 我是一名探鬼主播残揉,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼芋浮!你這毒婦竟也來了抱环?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎镇草,沒想到半個(gè)月后眶痰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡陶夜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年凛驮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片条辟。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡黔夭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出羽嫡,到底是詐尸還是另有隱情本姥,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布杭棵,位于F島的核電站婚惫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏魂爪。R本人自食惡果不足惜先舷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滓侍。 院中可真熱鬧蒋川,春花似錦、人聲如沸撩笆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夕冲。三九已至氮兵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間歹鱼,已是汗流浹背泣栈。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留醉冤,地道東北人秩霍。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蚁阳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子鸽照,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容