自学iOS开发系列----OC(block)
来源:互联网 发布:microsoft画图软件 编辑:程序博客网 时间:2024/05/19 16:34
1.block:块语法,是一种新的语法结构。学习的时候可以类比于函数指针。
2.block和函数指针对比
#import <UIKit/UIKit.h>#import "AppDelegate.h"//声明函数int add(int,int);int main(int argc, char * argv[]) { @autoreleasepool { //函数名表示函数的入口地址 int (*p)(int,int) = add; int num = p(3,5); NSLog(@"%d",num); //声明一个block,就如同把函数指针的*换成^ int (^block)(int,int); //实现这个block block = ^(int a,int b){ return a+b; }; NSLog(@"%d",block(3,6)); return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); }}//实现函数int add(int a,int b) { return a + b;}
3.block声明和实现写在一起
#import <UIKit/UIKit.h>#import "AppDelegate.h"int main(int argc, char * argv[]) { @autoreleasepool { /* * ^是块语法符号,变量名是voidBlock * 声明格式:返回值类型(^块变量)(参数类型1,参数类型2,...) * 实现格式:^(参数类型1,参数类型2,...) */ void (^voidBlock)(void) = ^(void){ NSLog(@"将block的声明和实现写在一起"); }; voidBlock(); return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); }}
4.__block关键字
#import <UIKit/UIKit.h>#import "AppDelegate.h"int main(int argc, char * argv[]) { @autoreleasepool { //块语法中能够访问到变量,但是变量无法被更改,如果想在块语法中更改捕获的变量,需要加__block关键字修饰 __block int number = 5; void (^changeVar)(int) = ^(int a){ number = a; }; changeVar(15); NSLog(@"%d",number); return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); }}
5.block传值
①创建Supermarket类
Supermarket.h
#import <Foundation/Foundation.h>@interface Supermarket : NSObject@property (nonatomic, copy) void(^byValueBlock)(NSString *);- (void)begin;- (void)finish;@end
Supermarket.m
#import "Supermarket.h"@implementation Supermarket- (void)begin { sleep(2); [self finish];}-(void)finish { self.byValueBlock(@"500元整");}@end
②创建Student类
Student.h
#import <Foundation/Foundation.h>@interface Student : NSObject- (void)buy;@end
Student.m
#import "Student.h"#import "Supermarket.h"@implementation Student-(void)buy { Supermarket *supermarket = [[Supermarket alloc] init]; NSLog(@"我购买的东西多少钱?"); supermarket.byValueBlock = ^(NSString *str){ NSLog(@"%@",str); }; [supermarket begin];}@end
③main.m
#import <UIKit/UIKit.h>#import "AppDelegate.h"#import "Student.h"int main(int argc, char * argv[]) { @autoreleasepool { Student *student = [[Student alloc] init]; [student buy]; return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); }}
6.block作为参数
①新建Market类
Market.h
#import <Foundation/Foundation.h>typedef void (^marketBlock)(void);@interface Market : NSObject- (void)beginWithMoney:(marketBlock)block;@end
Market.m
#import "Market.h"@implementation Market-(void)beginWithMoney:(marketBlock)block { NSLog(@"开始购物"); sleep(2); NSLog(@"购物完成了"); block();}@end
②创建Person类
Person.h
#import <Foundation/Foundation.h>@interface Person : NSObject- (void)buy;@end
Person.m
#import "Person.h"#import "Market.h"@implementation Person-(void)buy { Market *market = [[Market alloc] init]; [market beginWithMoney:^{ NSLog(@"这次买衣服又花了500元"); }];}@end
③main.m
#import <UIKit/UIKit.h>#import "AppDelegate.h"#import "Person.h"int main(int argc, char * argv[]) { @autoreleasepool { Person *person = [[Person alloc] init]; [person buy]; return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); }}
0 0
- 自学iOS开发系列----OC(block)
- 自学iOS开发系列----OC(数组)
- 自学iOS开发系列----OC(继承)
- 自学iOS开发系列----OC(类别和扩展)
- 自学iOS开发系列----OC(JSON解析)
- 自学iOS开发系列----OC(协议和委托代理)
- 自学iOS开发系列----OC(内存管理)
- 自学iOS开发系列----OC(属性、点语法、修饰符)
- 自学iOS开发系列----OC(文件管理类、文件句柄类)
- [黑马IOS自学第十七篇]OC BLOCK学习
- OC语言自学《十二》---- OC(block、@property)
- 【iOS开发系列】block编程
- 【ios开发系列】block详解
- 自学iOS开发系列----C语言(数组)
- 自学iOS开发系列----UI(视图编程入门:UIButton)
- 自学iOS开发系列----UI(视图编程入门:UIView)
- 自学iOS开发系列----UI(视图编程入门:UINavigationController)
- 自学iOS开发系列----UI(视图编程入门:UITabBarController)
- Android 百度云推送
- 常用SQL优化
- WKWebView添加cookie
- 动态规划 01背包问题(简单易懂)
- MyDocument.exe病毒查杀方法
- 自学iOS开发系列----OC(block)
- 设置页弹框背景不透明问题分析及解决
- 从LAMP到框架式开发的SOA:土巴兔8年架构之道
- 从Vuex中取出数组赋值给新的数组,新数组push时报错
- Kotlin:Android世界的Swift
- 工作流
- JavaScript立即执行函数表达式(IIFE)
- PowerShell命令
- 二叉树,波兰式,逆波兰式,二叉树的遍历