太阳高照 發表於 2022-11-24 11:35:01

swift指针及内存管理内存绑定实例详解

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>swift API 绑定</li><li>绕过编译器检查 - assumingMemoryBound</li><li>内存转换 - bindMemory</li><li>临时改变内存绑定 - withMemoryRebound</li></ul></div><p class="maodian"></p><h2>swift API 绑定</h2>
<p>swift提供了3种不同的API来绑定/重新绑定指针</p>
<div class="cros igoods"><div class="goodsin" data-img="https://img14.360buyimg.com/pop/jfs/t23545/97/1887471451/229732/be96aee/5b6d30efN406214df.jpg" data-name="零基础学Swift 图文版" data-owner="京东自营" data-price="86.1" data-tgid="38" data-url="https://union-click.jd.com/jdc?e=&amp;p=JF8BAMkJK1olXwUCVFxaDE4XBV8IGF4UVAAAUm4ZVxNJXF9RXh5UHw0cSgYYXBcIWDoXSQVJQwYBUV9UDkkRHDZNRwYlHVtfPVomCCtyYC9qBVllH2NRDwAETkcbM2gNHF4dXwMBZF5eDkwXAmoIK2sVXDZQOobrvpOysnPcsdTA1ZEyVW5dD0wfAGgIG1kXWQUHZF5VDHtUVypcWBhdbTYyV25tOEsnAF9WdVpGWwVQVgwPZhZHRzdDExxeMwYFXVtYCUIWM20JGlkXbTY"></div></div>
<ul><li>assumingMemoryBound(to:)</li><li>bindMemory(to: capacity:)</li><li>withMemoryRebound(to: capacity: body:)</li></ul>
<p class="maodian"></p><h2>绕过编译器检查 - assumingMemoryBound</h2>
<p>就是假定内存绑定</p>
<div class="jb51code"><pre class="brush:cpp;">func testPointer(_ p: UnsafePointer&lt;Int&gt;) {
    print(p)
}
let tuple = (30, 40)
withUnsafePointer(to: tuple) { (tuplePtr: UnsafePointer&lt;(Int, Int)&gt;) in
    testPointer(UnsafeRawPointer(tuplePtr)
    .assumingMemoryBound(to: Int.self))
}
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202211/20221124085353013.jpg" /></p>
<p>其实 两者本质没什么区别,都是指向内存的指针</p>
<p>UnsafePointer 指向1块Int内存</p>
<p>UnsafePointer&lt;Int, Int&gt; 指向一个元组tuple内存, 也就是一块连续的内存,包含连个连续的Int</p>
<p>两者都是首地址</p>
<p>一种方式就是不 强转 UnsafePointer&lt;Int, Int&gt; 为 UnsafePointer</p>
<ul><li>先把 元组指针转换成原始指针 UnsafeRawPointer(tuplePtr)</li><li>原始指针调用 assumingMemoryBound 绑定成Int 指针 UnsafeRawPointer(tuplePtr).assumingMemoryBound(to: Int.self)</li></ul>
<div class="jb51code"><pre class="brush:cpp;">func testPointer(_ p: UnsafePointer&lt;Int&gt;) {
    print(p)
    print(p)
}
let tuple = (30, 40)
withUnsafePointer(to: tuple) { (tuplePtr: UnsafePointer&lt;(Int, Int)&gt;) in
    testPointer(UnsafeRawPointer(tuplePtr).assumingMemoryBound(to: Int.self))
}
</pre></div>
<p>结果</p>
<blockquote><p>30</p>
<p>40</p></blockquote>
<p>assumingMemoryBound的意义在于:</p>
<p>有时候不想做指针类型转换来增加代码的复杂度</p>
<p>就可以调用 此api绕过编译器检查,但是并没有发生实际的指针转换</p>
<p class="maodian"></p><h2>内存转换 - bindMemory</h2>
<p>实际发生了转换,改变当前内存指针绑定的类型</p>
<div class="jb51code"><pre class="brush:cpp;">func testPointer(_ p: UnsafePointer&lt;Int&gt;) {
    print(p)
    print(p)
}
let tuple = (30, 40)
withUnsafePointer(to: tuple) { (tuplePtr: UnsafePointer&lt;(Int, Int)&gt;) in
    testPointer(UnsafeRawPointer(tuplePtr)
    .bindMemory(to: Int.self, capacity: 1))
}
</pre></div>
<p>结果</p>
<blockquote><p>30</p>
<p>40</p></blockquote>
<p>bindMemory - 相比于assumingMemoryBound,就是改变内存绑定类型</p>
<p class="maodian"></p><h2>临时改变内存绑定 - withMemoryRebound</h2>
<div class="jb51code"><pre class="brush:cpp;">func testPointer(_ p: UnsafePointer&lt;Int8&gt;) {
    print(p)
}
let UInt8Ptr = UnsafePointer&lt;UInt8&gt;.init(bitPattern: 30)
UInt8Ptr?.withMemoryRebound(to: Int8.self, capacity: 1,
        { (Int8Ptr: UnsafePointer&lt;Int8&gt;) in
    testPointer(Int8Ptr)
})
</pre></div>
<p>结果</p>
<blockquote><p>0x000000000000001e</p></blockquote>
<p>withMemoryRebound意义在于:</p>
<p>临时改变内存绑定,出了api 尾随闭包作用域之后,绑定就不存在了</p>
<p>最后,补充一个小tip</p>
<p>也许你会对swift 闭包 函数的语法形式感觉会不习惯,编译器也会自动直接转变为函数体</p>
<p>其实高级语言语法习惯仅仅就是一种语法而已</p>
<p>底层其实是函数栈的形式</p>
<p>一个函数 包括 函数名(也就是方法指针),多个参数,函数体(包含多个变量与调用)</p>
<p>内存表达函数的方式就是栈的形式:</p>
<p>入栈顺序: 函数指针,参数顺序入栈,函数体内部逐行顺序入栈</p>
<p>按照这个逻辑,最后一个尾随闭包参数就可以直接变为函数体,这样并不影响函数栈的入栈方式</p>
<p>以上就是swift指针及内存管理内存绑定实例详解的详细内容,更多关于swift指针内存管理绑定的资料请关注琼殿技术社区其它相关文章!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>Framework中实现OC和Swift的混编方案</li><li>Swift设计思想Result&lt;T&gt;与Result&lt;T, E: Error&gt;类型解析</li><li>Swift Error重构优化详解</li><li>Swift Error重构的基础示例详解</li><li>swift内存管理指针类型使用实例详解</li><li>Swift使用enum抹平数组元素差异实例详解</li><li>swift依赖注入和依赖注入容器详解</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: swift指针及内存管理内存绑定实例详解