Block的基本用法

NSString* (^myBlock)(NSString*,int);

myBlock= ^(NSString *name,intage){return[NSString stringWithFormat:@"My name is %@,I‘m %d years old!",name,age];

};

NSString*str = myBlock(@"胡曉偉",31);

NSLog(@"%@",str);

上面的例子演示了Block的基本用法,Block聲明的基本結(jié)構(gòu)是:

返回類型 (^變量名)(參數(shù)列表..)

例如:

void(^myBlock1)(void);//無返回值,無參數(shù)void(^myBlock2)(NSObject,int);//有返回值,有參數(shù)NSString* (^myBlock3)(NSString* name,intage);//有返回值和參數(shù),并且在參數(shù)類型后面加入了參數(shù)名(僅為可讀性)

將一個Block定義為函數(shù)參數(shù):

- (void)testBlock:(NSString *(^)(void)) myName

{

NSLog(@"My Name is %@",myName());

}- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

NSString*(^myBlock)(void) = ^{return@"wayne"; };

[self testBlock:myBlock];returnYES;

}

下面看看如何通過Block訪問不同上下文環(huán)境的局部變量:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

NSString*str =@"AAA";

NSString*(^myBlock)(void) = ^(void){returnstr;

};

[self logBlock:myBlock];returnYES;

}- (void)logBlock:(NSString *(^)(void))block

{

NSLog(@"%@",block());

}

下面的代碼測試了可變對象與不可變對象在Block中的情況:

NSString *str1 =@"str1";

NSMutableString*str2 = [NSMutableString stringWithString:@"str2"];

NSLog(@"************初始值與初始地址************");

NSLog(@"【%@】,【%p】",str1,&str1);

NSLog(@"【%@】,【%p】",str2,&str2);void(^myBlock)(void) = ^{

NSLog(@"************Block中輸出************");

NSLog(@"【%@】,【%p】",str1,&str1);

NSLog(@"【%@】,【%p】",str2,&str2);

};

str1=@"str1_update";

[str2 appendString:@"_update"];

NSLog(@"************更新后的值與地址************");

NSLog(@"【%@】,【%p】",str1,&str1);

NSLog(@"【%@】,【%p】",str2,&str2);

myBlock();

NSLog(@"************調(diào)用Block后的值與地址************");

NSLog(@"【%@】,【%p】",str1,&str1);

NSLog(@"【%@】,【%p】",str2,&str2);

輸出結(jié)果:

************初始值與初始地址************【str1】,【0xbff4d1f8】

【str2】,【0xbff4d1f4】************更新后的值與地址************【str1_update】,【0xbff4d1f8】

【str2_update】,【0xbff4d1f4】************Block中輸出************【str1】,【0xbff4d1e4】

【str2_update】,【0xbff4d1e8】************調(diào)用Block后的值與地址************【str1_update】,【0xbff4d1f8】

【str2_update】,【0xbff4d1f4】


可以看出在Block內(nèi),不可變對象的值任然是初始化時的值,可變對象的值變成了新值。這是因為Block初始化在前,可變對象的修改在后;如果顛倒順序,先修改可變對象的值,再初始化Block,這樣Block就能同步修改后的值了。

最后看看Block對變量的訪問權(quán)限:


#import"AppDelegate.h"@interfaceAppDelegate ()

{

NSString*str1;

}@end@implementationAppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

NSString*str2 =@"str2";

__block NSString*str3 =@"str3";void(^myBlock)(void) = ^{

str1=@"newString";//ok//str2 = @"newString";//errorstr3=@"newString";//okNSLog(@"%@,%@,%@",str1,str2,str3);

};

myBlock();returnYES;

}

在Block里不能直接修改局部變量的值,如果要修改,需要在局部變量前加上修飾關(guān)鍵字__block。

從上面的例子可以看到在Block里能訪問并修改類變量、帶__block關(guān)鍵字的變量;但是不能修改不帶__block關(guān)鍵字的局部變量。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容