2019-09-27swift内嵌函数内存安全

一:内嵌函数引用inout的参数时不能是逃逸的

func func1(inoutPara para : inout Int) {       

para = 3   

    func nestFun() ->  () -> Int{                                  

        return { 

            return para + 1

        }   

    }   

    nestFun() 

}

编译器会报错:Escaping closure captures 'inout' parameter 'para'

二:如果不对inout参数进行修改,可以采用这种形式解决:

 func nestFun() ->  () -> Int{            

        para = 4                     

        return {

            [para] in

            return para + 1

        }    

    }    

如果对inout参数进行修改,可以采用复制inout参数修改后再赋值给inout参数这种形式解决:

func func2(queue:DispatchQueue,inoutPara para :inoutInt) {

   var localX = para

    defer{ para = localX }

    // Operate on localX asynchronously, then wait before returning.

    queue.async { someMutatingOperation(&localX) }

    queue.sync{}

}

详细文档 Memory Safety.

三:func中不可再操作inout的原变量


var para=5

func inoutfunc(inoutpara :inoutInt) {

    print(inoutpara)

    print(para)

}

inoutfunc(inoutpara: &para)

报错:error: Execution was interrupted,reason: signal SIGABRT.

The process has been left at the point where it was interrupted,use "thread return -x" to return to the state before expression evaluation.

上例中,不可使用print(para)语句

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.Swift中函数的使用 函数的定义 外部参数 _的使用 常见的 "_" 在for循环中 函数的默认值 无返回值...
    思考的快与慢阅读 492评论 0 2
  • 主要总结一些平时遇到的疑难点,在此总结出来,持续更新。可能有些误导大家的地方,欢迎指正。 难点 get,set,w...
    Jimmy木阅读 2,605评论 1 10
  • 1、随机数 不需要随机数种子 arc4random()%N + begin:产生begin~begin+N的随机数...
    我是小胡胡123阅读 4,211评论 0 2
  • Swift008-琐碎知识点 三方库一处引入,处处使用// 可以建立一个文件放进去,如 Const.swift@_...
    DDY阅读 180评论 0 1
  • 似乎这是禁止烟花爆竹后每年都会有的感慨。想了想几年前烟花爆竹声中,春节联欢晚会的音量呼小呼弱。其实也许你只是缺了爆...
    没样貌没身材的姑娘阅读 284评论 0 1