//
// BlockBasementValueTypeAutoViewController.swift
// iOS底层
//
// Created by yanqunchao on 2019/5/18.
// Copyright © 2019 yanqunchao. All rights reserved.
//
import UIKit
class BlockBasementValueTypeAutoViewController: 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(reserved:Int,BlockSize:Int) {
self.reserved = reserved
self.BlockSize = BlockSize
}
override init() {
}
}
/*
* 访问auto局部变量(值类型)的block类
**/
class MainBlockImpl0: NSObject {
var imp: BlockImpl?
var Desc: MainBlockDesc0?
var age: Int?
init(fp:@escaping FuncPt,Desc:MainBlockDesc0,flag:Int, age:Int) {
imp = BlockImpl()
// imp!.isa = &_NSConcreateStackBlock
imp?.Flags = flag
imp?.FuncPtr = fp
self.Desc = Desc
self.age = age
}
override init() {
}
}
/*
*block调用的函数地址
**/
func mainBlockFunc0(block:MainBlockImpl0){
print("调用mainBlockFunc0函数获取的变量值为\(block.age!)))")
}
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .white
blockWithAutoLocalVar()
}
func blockWithAutoLocalVar(){ // 访问auto类型的局部变量的block
var age = 10
let mainBlockDesc0Data = MainBlockDesc0(reserved: 0, BlockSize: MemoryLayout.size(ofValue: MainBlockImpl0.self))
let block = MainBlockImpl0(fp: mainBlockFunc0, Desc: mainBlockDesc0Data, flag: 0, age: age)
age = 20
block.imp?.FuncPtr!(block)
}
}
iOS原理之Block的访问auto变量(值类型)的实现原理
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 2018年09月05日 补充:转 C++ 使用的命令 注:分析参考 MJ底层原理班 内容,本着自己学习原则记录 本...
- guidelines n.指导方针;指导原则 concept n.观念,概念;观点;思想,设想,想法;总的印象 p...