美文网首页
iOS原理之Block的访问auto变量(static类型)的实

iOS原理之Block的访问auto变量(static类型)的实

作者: yqc5521 | 来源:发表于2019-05-19 11:15 被阅读0次
    //
    //  BlockBasementStaticTypeAutoViewController.swift
    //  iOS底层
    //
    //  Created by yanqunchao on 2019/5/19.
    //  Copyright © 2019 yanqunchao. All rights reserved.
    //
    
    import UIKit
    
    class BlockBasementStaticTypeAutoViewController: UIViewController {
        typealias FuncPt = ((MainBlockImpl0)->())
      
        class BlockImpl: NSObject {
            var isa:UnsafeRawPointer?
            var Flags:Int?
            var Reserved:Int?
            var FuncPtr:FuncPt? //函数地址,
        }
        /*
         * 访问auto局部变量的Desc类
         **/ 
        class MainBlockDesc0: NSObject {
            var reserved:Int?
            var BlockSize:Int?
            
            init(reserve:Int,blockSize:Int) {
                reserved = reserve
                BlockSize = blockSize
            }
            
            override init() {
                
            }
            
        }
        /*
         * 访问static局部变量的block类
         **/ 
        class MainBlockImpl0: NSObject {
            var imp: BlockImpl?
            var Desc: MainBlockDesc0?
            var height: UnsafeMutablePointer<Int>? //局部变量的地址
            init(fp:@escaping FuncPt,Desc:MainBlockDesc0,flag:Int,height:UnsafeMutablePointer<Int>) {
                imp = BlockImpl()
    //            imp!.isa = &_NSConcreateStackBlock
                imp?.Flags = flag
                imp?.FuncPtr = fp
                self.Desc = Desc
                self.height = height
            }
            override init() {
    
            }
        }
        /*
         *block调用的函数地址
         **/
        func mainBlockFunc0(block:MainBlockImpl0){
            print("调用mainBlockFunc0函数获取的变量值为\(block.height!.pointee)))")
        }
    
        
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Do any additional setup after loading the view.
        }
        
    
        
        func blockWithStaticLocalVar(){ // 访问static类型的局部变量的block
    
            var staticHeight:Int = 10 //假设是静态局部变量(swift无法创建局部静态变量,无法模拟其场景) 
         
            let mainBlockDesc0Data = MainBlockDesc0(reserve: 0, blockSize: MemoryLayout.size(ofValue: MainBlockImpl0.self))
    
            let block = MainBlockImpl0(fp: mainBlockFunc0, Desc: mainBlockDesc0Data,flag: 0, height: &staticHeight)
    
            staticHeight = 20
    
            block.imp?.FuncPtr!(block)
        }
    
    }
    

    相关文章

      网友评论

          本文标题:iOS原理之Block的访问auto变量(static类型)的实

          本文链接:https://www.haomeiwen.com/subject/cgbfzqtx.html