16iOSIOS开发者学习笔记

04.实战技术 block深入研究,UICollectionVi

2016-01-16  本文已影响301人  Liwx

@(iOS Study)[实战技术]


目录



1.block的深入研究

block的作用: 可以用来保存一段代码段,也可以用来传递参数.block如果存放代码段,该代码段并不会马上执行,需用手动调用.

block基本使用

// block的完整格式
block返回类型(^block变量名)(block参数) = ^(block返回类型,一般情况都省略)(block参数>) {
    // block代码段
}
// block声明:返回值(^Block变量名)(block参数类型),参数变量名可以省略
void(^block)();
void(^block1)(int);
    // block定义: 等号右边 ^(参数类型 参数变量名){};
    void(^block2)(int a) = ^(int a){
        
    };
    
    // block定义二: 等号右边 ^返回值(参数类型 参数变量名){};,返回值(=号后面第一个int)可以省略,但是也有不省略
    int(^block3)(int a) = ^int(int a){
        return 2;
    };
    
    // block定义三: 当没有返回值,没有参数,可以省略
    void(^block4)() = ^{
        
    };

block开发使用场景(保存代码)

// 声明block类型的成员属性
@interface CellItem : NSObject
// 声明一个block类型的成员属性
@property (nonatomic, strong) void(^block)();
@property (nonatomic, strong) NSString *title;
+ (instancetype)itemWithTitle:(NSString *)title;
@end

// 给block添加代码段
CellItem *item = [CellItem itemWithTitle:@"打电话"];
item.block = ^{
    NSLog(@"打电话");
};

// 执行block,需判断block是否为空,如果为空,调用时会导致程序奔溃
if (item.block) {
    item.block();
}

block开发使用场景(传值)

顺传:定义属性
逆传:代理,block,block可以用来替代代理

block内存管理(MRC)

block内存管理(ARC)

block循环引用

block会对外部所有强指针对象给强引用,block不会对外部弱指针对象给强引用.

block循环引用(复杂)

block变量传递

- (void)test
{
    // block访问外部局部变量没有被任何关键字修饰,都是值传递.值传递表示外部的value值改变不会影响block内部的值.
    int value = 10;
    
    void(^block)() = ^{
        
        NSLog(@"%d", value);
    };
    
    value = 20;
    
    block();
    
    // 打印结果: 10
}
- (void)test1
{
    //  block访问外部变量是全局变量或者被__block,static修饰,都是指针传递,block中的value会随外部的改变而改变.
    static int value = 10;
    
    void(^block)() = ^{
        NSLog(@"%d", value);
    };
    
    value = 20;
    
    block();
    
    // 打印结果: 20
}

block开发使用场景(参数使用)

// block当参数使用 caculatorBlock带有一个参数result,并且返回值为int类型
- (void)caculator:(int(^)(int result))caculatorBlock;

block开发中使用场景(返回值)

- (void)test1
{
    // self.add()相当于调用 add的get方法,get方法返回值是block类型的,再用返回值调用
//    void(^block)() = self.add;
//    block();
    
    self.add();
}

- (void(^)())add
{
    return ^{
        NSLog(@"add");
    };
}

2.UICollectionView的使用

UICollectionView注意点

上一篇 下一篇

猜你喜欢

热点阅读