總是會(huì)遇到這四種傳值方法泰演,渣渣總結(jié)了一下呻拌,大神不許恥笑!望指正睦焕。
1藐握、委托(代理)
1、分清主動(dòng)類和被動(dòng)類垃喊。例如:A類要讓B類來(lái)完成某些事情猾普,那么A類就是主動(dòng)類,B類是被動(dòng)類本谜,B類是A類的委托初家。
2、在主動(dòng)類.h中設(shè)置協(xié)議乌助。協(xié)議規(guī)范名稱為:<本類名+Delegate>溜在,且繼承自基協(xié)議Object。在協(xié)議中可以聲明一些方法他托,但不能聲明成員變量掖肋。并在@interface中設(shè)置@property (nonatomic, assign) id<協(xié)議名>delegate;
3、在主動(dòng)類.m中進(jìn)行容錯(cuò)處理赏参。
4志笼、在被動(dòng)類.m中引入主動(dòng)類的頭文件和協(xié)議沿盅,設(shè)置主動(dòng)類的對(duì)象,并將對(duì)象的delegate = self籽腕。最后實(shí)現(xiàn)協(xié)議中的方法嗡呼。
2纸俭、block
1皇耗、同委托一樣,首先分清主動(dòng)類和被動(dòng)類揍很。
2郎楼、在主動(dòng)類.h中的@interface上部 定義block類。typedef + 返回值 + (^block) + (參數(shù)類型 參數(shù))窒悔。 并在@interface中 @property (nonatomic, copy) block + block的屬性名;
3呜袁、在被動(dòng)類.m中引入主動(dòng)類的頭文件,設(shè)置主動(dòng)類的對(duì)象简珠,此時(shí)主動(dòng)類對(duì)象就擁有了block的屬性 = ^(返回值) + (參數(shù)類型 參數(shù)) + {代碼塊}; ? ? ? ? ? 其中阶界,返回值若是空可以不寫。在代碼塊中實(shí)現(xiàn)具體方法聋庵。
4膘融、接下來(lái)只需要在主動(dòng)類中 給之前定義的 block的屬性賦參數(shù)即可。
3祭玉、單例
單例就像第三方一樣氧映,A要把值傳給B,那么A先把值傳給了C(其中C是永恒不變的)脱货,然后B再?gòu)腃中取出值岛都,這樣就實(shí)現(xiàn)了A向B的傳值。
1振峻、分清主動(dòng)類和被動(dòng)類
2臼疫、新建單例類,聲明(同時(shí) 聲明一個(gè)id類型的屬性object)+實(shí)現(xiàn)(實(shí)現(xiàn)有兩種方法)扣孟。
3烫堤、主動(dòng)類.m中設(shè)置單例的對(duì)象,先調(diào)用單例的share方法哈打。此時(shí)單例對(duì)象就有了屬性object = 要傳的值塔逃。(single.object)
4、被動(dòng)類.m中設(shè)置單例的對(duì)象料仗,先調(diào)用單例的share方法湾盗。再將single.object賦給被動(dòng)類需要得到值的對(duì)象。
單例的兩種寫法:
1立轧、
static AccountManager *DefaultManager = nil;
+ (AccountManager *) defaultManager {
? ? ? if (!DefaultManager) { ? ?
? ? ? ? ? ? ?DefaultManager?=?[[self?allocWithZone:NULL]?init];
? ? ? }
? ? ? return DefaultManager;
}
2格粪、
+ (AccountManager *) sharedManager
{
? ? ? static AccountManager?*sharedAccountManagerInstance?=?nil;
? ? ? static dispatch_once_t?onceToken;
? ? ? dispatch_once(&onceToken, ^{
? ? ? sharedAccountManagerInstance?=?[[self?alloc]?init];
});
return sharedAccountManagerInstance;
}