9.22-oc-block

static: 生命周期,作用域,存储位置

对于全局变量来说,本身生命周期就是在整个程序

对于局部变量来说,改变了生命周期,为当前的函数体内,改变了存储位置,不在堆/栈上,在一个静态存储空间里,但是作用域并没有改变。

extern: 声明,下划线

只是用来获取全局变量(包括全局静态变量)的值,不能用于定义变量

extern工作原理:先在当前文件查找有没有全局变量,没有找到,才会去其他文件查找。

在内存中存储的是为下划线的样式,例如变量a,b,c即_a,_b,_c

*重点错误

1 duplicate symbol for architecture x86_64

此错误说明了在声明文件中使用了其他文件的变量,而未进行extern

block:swift中的闭包

主要用法:

  • 普通传值调用
  • 作为函数参数调用
  • 作为类属性调用

在.h声明文件中

#import 

@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)

你可能感兴趣的:(9.22-oc-block)