OC
- block類型實(shí)例變量:回傳值(^名字)(參數(shù)列);
- typedef 回傳值(^名字)(參數(shù)列);
- 實(shí)現(xiàn)體:^(參數(shù)列){} 如果沒(méi)有參數(shù)可以省略參數(shù)列和圓括弧
- 形參類型:(回傳值(^)(參數(shù)列))名字
- 返回一個(gè)block:(回傳值(^)(參數(shù)列))名字:(參數(shù)類型)參數(shù)名,...
Swift
- block類型實(shí)例變量:名字:(參數(shù)列表)->(返回值)
- typedef 名字 = (參數(shù)列表)->(返回值)
- 實(shí)現(xiàn)體:{[捕獲值列表](參數(shù)列表)in 語(yǔ)句}
- 形參類型:名字:(參數(shù)列表)->(返回值)
C 函數(shù)
- block類型實(shí)例變量: 回傳值 (*名字)(參數(shù)列)
- typedef 回傳值 (*名字)(參數(shù)列)
- 實(shí)現(xiàn)體: 好像沒(méi)有帶參數(shù)、返回值之類的匿名函數(shù)塊
- 形參類型: 回傳值(*名字)(參數(shù)列)
- 返回一個(gè)函數(shù):回傳值(*名字((參數(shù)類型)參數(shù)名1,...))(參數(shù)列)
arc問(wèn)題
arc是引用類型的來(lái)說(shuō)的。值類型的內(nèi)存管理與arc無(wú)關(guān)。arc內(nèi)存管理操作方法:可變拷貝, 不可變拷貝 const, 保持強(qiáng)引用, 保持弱引用
1.給類成員變量賦值
2.給臨時(shí)變量賦值
3.函數(shù)傳參
4.閉包捕獲
5.作為函數(shù)/閉包的返回值返回
深拷貝,淺拷貝是另一個(gè)概念

apple object copying

內(nèi)存管理.png
參考:
-(void)test_7 {
NSMutableString *p2 = [NSMutableString stringWithString:@"111111111"];
void (^block)(NSString *p) = ^(NSString *p) {
NSLog(@"%@", p);
NSString *p3 = p2;
p3 = @"33333";
};
NSLog(@"%@", p2);
block(@"helloworld");
NSLog(@"%@", p2);
NSLog(@"test6 end!!");
}
-(void)test_6 {
NSMutableString *p2 = [NSMutableString stringWithString:@"111111111"];
void (^block)(NSString *p) = ^(NSString *p) {
NSLog(@"%@", p);
NSMutableString *p3 = p2;
[p3 appendString:@"2222222"];
};
NSLog(@"%@", p2);
block(@"helloworld");
NSLog(@"%@", p2);
NSLog(@"test6 end!!");
}
-(void)test_5 {
NSMutableString *p2 = [NSMutableString stringWithString:@"111111111"];
void (^block)(NSString *p) = ^(NSString *p) {
NSLog(@"%@", p);
[p2 appendString:@"2222222"];
};
NSLog(@"%@", p2);
block(@"helloworld");
NSLog(@"%@", p2);
NSLog(@"test5 end!!");
}
-(void)test_4 {
CLGeocoder *coder = [[CLGeocoder alloc]init];
CLLocation *locaiont = [[CLLocation alloc]initWithLatitude:39.2610740000 longitude:117.1818350000];
__block NSDictionary *result;
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
[coder reverseGeocodeLocation:locaiont completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
if (error) {
NSLog(@"%@",error);
} else {
for ( CLPlacemark * i in placemarks) {
NSLog(@"%@", i.addressDictionary);
result = i.addressDictionary;
break;
}
}
dispatch_group_leave(group);
}];
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"%@", result );
});
NSLog(@"test 4end!!!!");
}
-(void)test_3 {
__block NSMutableString *p = [NSMutableString string];
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0) , ^{
sleep(5);
[p appendString: @"hellworooldd!!!!"];
[p appendString: @"3333333!!!!"];
[p appendString: @"4444444!!!!"];
dispatch_group_leave(group);
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"%@", p );
});
NSLog(@"end!!!!");
}
-(void)test_2 {
__block NSString *p = @"helo";
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0) , ^{
sleep(5);
dispatch_group_leave(group);
p = @"hellworooldd!!!!";
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"%@", p );
});
NSLog(@"end!!!!");
}
-(void)test_1 {
self.str = @"111111";
[self performSelectorOnMainThread:@selector(modifyStr) withObject:nil waitUntilDone:false];
// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
// NSLog(@"%@", self.str);
// sleep(3);
// NSLog(@"%@", self.str);
// });
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSString *p = self.str;
NSLog(@"%@", p);
sleep(3);
NSLog(@"%@", p);
}); NSLog(@"test end...");
}
-(void)modifyStr {
dot;
self.str = @"222222";
}
作為一個(gè)閉包,它需要具備的原則
1,block捕獲值,不能被外面的修改而被修改。
2,block捕獲值,修改捕獲的值,外面可以用到被修改后的結(jié)果。