zoukankan      html  css  js  c++  java
  • 对于Block的一些理解与认识

    //
    //  ViewController.m
    //  BlockTest
    //
    //  Created by CoderHJChao on 8/13/15.
    //  Copyright (c) 2015 CoderHJChao. All rights reserved.
    //
    
    #import "ViewController.h"
    
    @interface ViewController ()
    {
        NSString *_name; // 名字
    }
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        /* 1.简单为block赋值
        _testBlock = ^(id sender)
        {
            NSLog(@"我是全局block类型,__NSGlobalBlock__");
        };
         */
        
        /* 2.ARC上引用外部变量
        int i = 100;
        _testBlock = ^(id sender)
        {
            NSLog(@"我是堆block类型, i%d,__NSMallocBlock__",i);
        };
        
        NSLog(@"block %@",^(id sender)
              {
                  NSLog(@"我是堆block类型, i%d,__NSMallocBlock__",i);
              });
        
        NSLog(@"block %@",_testBlock);
        */
        
        
        /* 3.MRC上引用外部变量
         int i = 100;
         _testBlock = [^(id sender)
         {
             NSLog(@"我是栈block类型, i%d,__NSStackBlock__",i);
         } copy];
         */
    
        /* 4.ARC上引用外部变量*/
    //    __block ViewController *weakSelf = self;
        
        __block typeof(self) weakSelf = self;
        _testBlock = ^(id sender)
        {
            [weakSelf setStringName:@"nana"];
        };
        
     
    
        
    /*
    总结:
     1.block是一个对象,因为它也有OC里面的isa指针
     2.block是匿名函数,它是基于C的函数拓展,它是一个函数指针
     3.block是通过闭包传值,用于异步处理及方法回调、
     4.block在内存中分三种类型,分别是 全局block,堆block,栈block
    
     4.1 如果block没有引用外部变量的时候是全局block(__NSGlobalBlock__)
     
     4.2 如果引用外部变量的话,block的初始化是在栈上,
     一般我们在ARC上使用的Block是堆block(__NSMallocBlock__),因此在ARC上编译器自动把block拷贝到堆上
     
     4.3 如果引用外部变量的话,block的初始化是在栈上,
     我们在MRC上使用的Block就是栈block(__NSStackBlock__),如果block出了栈的作用域外,block就会被自动释放。如果要在堆作用域中使用block,必须要把block手动拷贝到堆上
     
     5. block 容易导致循环引用
     因为外部对象引用了block,block内部又引用外部对象,所以导致循环引用。
     解决方法:在ARC上,我们可以使用weak关键字作为破解循环引用;但在MRC上,我们可以用__block关键字破解循环引用; 可以让block弱引用内部的变量,从而在释放的时候先断开弱引用,在释放block与外部的
     
     Strong 跟 weak的区别是什么?
     strong引用,引用计数加一,两个对象生命周期就会绑定在一起
     
     */
    }
    
    // 改变全局变量
    - (void)setStringName:(NSString *)name
    {
        _name = name;
    }
    
    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
        NSLog(@"%@",_testBlock);
    }
    @end
  • 相关阅读:
    kali渗透综合靶机(十七)--HackInOS靶机
    kali渗透综合靶机(十六)--evilscience靶机
    kali渗透综合靶机(十五)--Breach-1.0靶机
    kali渗透综合靶机(十四)--g0rmint靶机
    DVWA-文件上传学习笔记
    kali渗透综合靶机(十三)--Dina 1.0靶机
    Weblogic-SSRF漏洞复现
    kali渗透综合靶机(十二)--SickOs1.2靶机
    IIS_CVE-2015-1635-HTTP.SYS远程执行代码漏洞复现
    【Flask+Redis】 python学习第一章
  • 原文地址:https://www.cnblogs.com/zhaohanjun/p/4726515.html
Copyright © 2011-2022 走看看