static: 生命周期,作用域,存储位置
对于全局变量来说,本身生命周期就是在整个程序
对于局部变量来说,改变了生命周期,为当前的函数体内,改变了存储位置,不在堆/栈上,在一个静态存储空间里,但是作用域并没有改变。
extern: 声明,下划线
只是用来获取全局变量(包括全局静态变量)的值,不能用于定义变量
extern工作原理:先在当前文件查找有没有全局变量,没有找到,才会去其他文件查找。
在内存中存储的是为下划线的样式,例如变量a,b,c即_a,_b,_c
*重点错误
1 duplicate symbol for architecture x86_64
此错误说明了在声明文件中使用了其他文件的变量,而未进行extern
block:swift中的闭包
主要用法:
- 普通传值调用
- 作为函数参数调用
- 作为类属性调用
在.h声明文件中
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (nonatomic,copy) void (^Blo2)(void);
-(void)BLOCK:(void(^)(void))handle;
@end
在.m实现文件中
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
//NSInteger a = 17;
- (void)viewDidLoad {
[super viewDidLoad];
NSInteger a = 10;
NSLog(@"a = %ld",a);
NSLog(@"&a = %p",&a);
void (^Block)(void)=^{
// a = 11;
NSLog(@"a = %ld",a);
NSLog(@"&a = %p",&a);
};
a = 12;
NSLog(@"调用前:a = %ld",a);
NSLog(@"调用前:&a = %p",&a);
Block();
NSLog(@"调用后:a = %ld",a);
NSLog(@"调用后:&a = %p",&a);
//Block作为函数参数
ViewController *view = [ViewController new];
[view BLOCK:^{
NSLog(@"ss");
}];
//Block作为属性
view.Blo2 =^ {
NSLog(@"xx");
};
view.Blo2();
}
- (void)BLOCK:(void(^)(void))handle{
static NSInteger a = 8;
handle();
};
@end
注意事项:
1.作为全局变量和静态变量,Block改变的是同一个值,同一个地址,其他的都是将其从栈上复制一份到堆上。
2.__block将局部变量进行修饰,但是实质还是将其复制了一份,但是其后的每一次都是同一个。
3.block不能改变局部变量的值。
4.block如果要使用局部变量,也是将其复制一份,但是只有可读权限,不能改变其值,但是再次改变局部变量的值的时候,还是改变外部的,block中的值并不会发生改变。
5.注意文件中ARC是否启用,在不同的环境下,可能输出的地址会有所不同,默认为ARC会自动启用。(ARC :Automatic Reference Counting)