blocks 是 C 语言的扩充功能。blocks 是带有自动变量(局部变量)的匿名函数。
截获自动变量 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int main() { int dmy = 256; int val = 10; const char *fmt = "val = %d\n"; void (^blk)(void) = ^{ printf(fmt,val); }; val = 2; fmt = "These value were changed. val = %d\n"; blk(); return 0; } 结果:val = 10
分析:block 语法的表达式使用的是它之前声明的自动变量 fmt 和 val。block 表达式截获所使用的自动变量的值为瞬间值。因为 block 表达式保存了自动变量的值(截获),所以在执行 block 语法后,即使改写了 block 中使用的自动变量的值也不会影响 block 执行的结果。
看到项目中,有人这样写 __weak __typeof__(self) wself = self;。我查了一下资料,总结一下。
typeof关键字是C语言中的一个新扩展,在linux内核中应用非常广泛。
说明 typeof()的参数可以是表达式或一种类型。返回的结果是一种类型。
表达式 typeof(x[0](1));
这里假设 x 是一个函数指针数组,这样就可以得到这个函数返回值的类型了。如果将 typeof 用于表达式,则该表达式不会执行。只会得到该表达式的类型。以下示例声明了 int 类型的 var 变量,因为表达式 foo() 是 int 类型的。由于表达式不会被执行,所以不会调用 foo 函数。
1 2 extern int foo(); typeof(foo()) var; 一种类型 typeof(int *) a,b; 等价于:int *a,*b;
例子 把 y 定义成 x 指向的数据类型:
typeof(*x) y;
把 y 定义成 x 指向数据类型的数组:
typeof(*x) y[4];
把 y 定义成一个字符指针数组:
在项目导航面板中选中 main.m ,可以看到
1 2 3 4 5 int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } 这是 iOS 应用的入口函数。UIApplicationMain 函数会创建一个 UIApplication 对象。每个 iOS 应用都有且只有一个 UIApplication 对象(单例),该对象的作用时维护运行循环。一旦程序创建了某个 UIApplication 对象,该对象的运行循环就会一直循环下去,main() 的执行也会因此阻塞。
此外,UIApplicationMain 函数还会创建某个指定类(此处为 AppDelegate)的对象,并将其设置为 UIApplication 对象的 delegate。UIApplicationMain 函数的第三个实参为 NSString 类型,指定了该对象所属的类。UIApplication 的 delegate 都需要遵守 UIApplicationDelegate 协议。
@interface AppDelegate : UIResponder <UIApplicationDelegate>
在应用启动运行循环时,UIApplication 对象会在应用出现相应状态变化时,向其 delegate 发送特定的消息。如:
1 2 3 4 5 6 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; - (void)applicationWillResignActive:(UIApplication *)application; - (void)applicationDidEnterBackground:(UIApplication *)application; - (void)applicationWillEnterForeground:(UIApplication *)application; - (void)applicationDidBecomeActive:(UIApplication *)application; - (void)applicationWillTerminate:(UIApplication *)application; UIApplication 负责建立应用程序的事件循环(Event Loop),事件循环中可以不断接收交互操作,比如屏幕触摸手势、各类传感器(重力加速器、陀螺仪等)等。