首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Objective-C闭包已转换为Swift,但仍在重复运行,没有完成,也没有错误

这个问题可能是由于闭包中的循环引用导致的。在Swift中,闭包会捕获其周围的变量和常量,如果闭包中捕获了一个强引用的对象,并且该对象也强引用了闭包,就会形成循环引用。这种情况下,闭包和对象会互相持有对方,导致无法释放,从而导致重复运行的问题。

为了解决这个问题,可以使用Swift中的捕获列表(capture list)来避免循环引用。捕获列表可以在闭包定义的同时指定需要捕获的变量,并且可以通过将变量声明为弱引用或无主引用来打破循环引用。

例如,如果闭包中捕获了一个对象self,并且该对象也强引用了闭包,可以使用捕获列表来声明self为弱引用,示例如下:

代码语言:txt
复制
{ [weak self] in
    // 使用self
}

在上述示例中,闭包中的self被声明为弱引用,这样闭包和对象之间的循环引用就被打破了。

另外,还可以使用无主引用来解决循环引用的问题。无主引用适用于被捕获的对象在闭包的生命周期内始终存在的情况。

代码语言:txt
复制
{ [unowned self] in
    // 使用self
}

在上述示例中,闭包中的self被声明为无主引用。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Swift 是猴还是猿?

Swift 结合了C和Objective-C 的优点并且不受 C 兼容性的限制。Swift采用安全的编程模式并添加了很多新特性,比如范型、、函数式编程等,使编程更简单,更灵活,也更有趣。...Swift强制要求if、while、for后面判断式子一定需要传入布尔类型。因此写成以下这种判断就会编译错误,因为a = 0的结果是a是Int型而非布尔型。Yoda表达式这种变通写法再也没有必要。...Case里面没有break语句,不会再偶然地出现bug! 8.区间运算符 (1)区间运算符 区间运算符(a…b)定义一个包含从a到b(包括a和b)的所有值的区间。a的值不能超过b。...Eg: 元组的最大用途在函数可以返回多个值: Swift里面定义一个 = {(形参) -> 返回值 in 代码实现},in 用于区分函数定义和代码实现: 最简单的,如果没有参数...Swift 3.2到Swift 4.0,性能运行效率提升不明显,基本没有提升; b.

3.9K30

Swift是花拳绣腿吗?——谈谈开发语言与程序员的职业发展

这样可以避免由于程序员疏忽,流程没有被switch-case经过处理,而引起的逻辑错误。 我们可以看到Swift中的安全特性确实有助于新手减少Bug和逻辑错误。...有以下3个特点: 匿名函数(方法); 可以被执行; 可以被作为参数传递。 提到,想必很多人都会想到JavaScript。我们就来对比一下JavaScript的。...如果与 Objective-C比较,Swift在书写效率上完胜。 在编译效率上,由于Swift没有.h头文件和一些其他特性,因此比Objective-C在理论上要快。...对于SwiftObjective-C运行效率,primateLab进行了一个对比测试。...如果是全新的项目,就可以考虑使用Swift了。 从上面的分析可以看出,一门语言对项目的影响并没有那么大,对于程序员职业发展的影响也没有那么大。

1.6K30
  • 译文: 低调奢华有内涵的「Runtime」

    这是一篇译文,原文是The down low on Objective-C Runtime ,原文文风俏皮,所以我也没有直译,尽量意译。...虽然Swift是用来取代Objective-C的,苹果依然继续维护Ovjective-C。主要改进了:可以更好地和Swift编译,并添加了很多新特性,如nullability、generics。...Objective-C的Runtime就像一把双刃剑,使用它,风险高,回报也高。它赋予你很大的权力,只要你犯了哪怕一丁点儿错误,都有可能让程序挂掉。...如果是源的框架,就不好说了。当然你可以报告这个问题,并且保佑很多人也遇到同样的问题,然后祈祷作者可以快速地修复,确实很难保证问题会得到解决——很可能你也没有时间跟他耗。...我们报告了这个错误,并且收到了在下一个版本中会修复这个问题的回复——悲剧的是,对方没有明确什么时候会发下一版。

    97140

    苹果仍在研发更大尺寸的 iMac | Swift 周报 issue 60

    长期关注苹果的一名资深记者透露,苹果公司仍在探索屏幕尺寸更大的 iMac。...4) 讨论测试基于的异步 API内容大概在XCTest中,当设置一个非零超时时间时,fulfillment(of:timeout:) API 会旋转运行循环并等待最长指定时间,直到 XCTestExpectation...在实际应用中,start() 函数创建了一个无结构的Task,没有等待其值,这意味着当 start() 返回时,任务中的异步操作可能尚未完成。...为了解决这个问题,可以修改代码,让 start() 函数返回一个 Task,并在 confirmation() 中等待该任务完成。...作者详细说明了 onGeometryChange 的三个参数:可观察的结果类型、用于几何转换的,以及处理转换结果的

    13111

    Swift: 有用的标准库全局函数

    全局函数 Global functions :无需特定类型范围就可以从任何地方访问的函数是一个古老的概念,在 C 和 Objective-C 等语言中很流行,但是在 Swift 中不建议使用,因为我们希望对它们进行很好的类型化和范围划分...如果您需要同时迭代两件事,这将非常有用,因为如果没有zip,则必须手动构建一个for循环并分别访问每个数组中的每个索引。使用zip可以使您以更实用的for-in方式访问所有数组中的元素。...superview } 这是sequence()的最佳用例,因为此函数的目的是为您提供一个序列,该序列反复应用特定的。由于此方法的递归内容 currentView = currentView?....view.backgroundColor = .green } 它的工作方式是sequence()返回自定义的UnfoldFirstSequence类型,这是Sequence的简单包装,该包装不断在其next()函数中反复应用...尽管结构本身就是值类型,其中的内容可能不是。

    2.7K20

    Swift 周报 第四十三期

    另一种考虑的方法是使用宏,这些可能不适用于较旧的操作系统版本,从而带来兼容性挑战。 该对话强调了与处理重复的枚举案例名称相关的编译器错误,该错误使枚举实例的唯一性变得复杂。...它类似于函数的想法,从技术上讲,函数承诺返回一些东西,实际上却没有,而编译器静态地证明了理论上的不可能。...使用ID 3315857-f51d8ce5加入Swift社区排行榜。 我们鼓励参与者每天使用 Swift 尝试挑战。排行榜跟踪完成时间,分数只是为了好玩,可以忽略。...计算机编程语言原理与源码实例讲解:Swift 函数和[15] 摘要: 这篇 Swift 博客介绍了计算机编程语言原理与源码实例中的 Swift 函数和。...文章首先介绍了 Swift 作为一种强类型、编译型、面向对象的编程语言的背景。 然后,详细讲解了函数和的核心概念和联系,包括函数的定义、调用和返回值,以及的定义、调用和返回值。

    23010

    Swift 3.1 的新变化「译」

    它从序列的开头开始,并停在给定返回false的第一个元素上。 drop(while:) 相反:它返回从给定关闭返回false的第一个元素开始的子序列,并在序列结尾完成。...逃逸(Escaping Closures) 在Swift 3.0 [ SE-0103 ] 中函数中的的参数是默认是不逃逸的(non-escaping)。...在Swift 3.1中,您可以使用新的函数withoutActuallyEscaping()将非逃逸换为临时逃逸。...f 与 g 进入函数后由非逃逸状态,分别转换为逃逸:escapableF和escapableG。 async(execute:) 的调用需要逃逸,我们在上面已经进行了转换。...通过运行sync(flags: .barrier),您确保async(execute:)方法完全完成,稍后将不会调用。 在范围内使用 escapableF and escapableG.

    1.7K20

    Swift 周报 第四十三期

    另一种考虑的方法是使用宏,这些可能不适用于较旧的操作系统版本,从而带来兼容性挑战。 该对话强调了与处理重复的枚举案例名称相关的编译器错误,该错误使枚举实例的唯一性变得复杂。...它类似于函数的想法,从技术上讲,函数承诺返回一些东西,实际上却没有,而编译器静态地证明了理论上的不可能。...使用ID 3315857-f51d8ce5加入Swift社区排行榜。 我们鼓励参与者每天使用 Swift 尝试挑战。排行榜跟踪完成时间,分数只是为了好玩,可以忽略。...计算机编程语言原理与源码实例讲解:Swift 函数和[15] 摘要: 这篇 Swift 博客介绍了计算机编程语言原理与源码实例中的 Swift 函数和。...文章首先介绍了 Swift 作为一种强类型、编译型、面向对象的编程语言的背景。 然后,详细讲解了函数和的核心概念和联系,包括函数的定义、调用和返回值,以及的定义、调用和返回值。

    21810

    Swift 3.1的新改动

    它从序列的开头开始,并停在给定返回false的第一个元素上。 drop(while:) 相反:它返回从给定关闭返回false的第一个元素开始的子序列,并在序列结尾完成。...逃逸(Escaping Closures) 在Swift 3.0 [ SE-0103 ] 中函数中的的参数是默认是不逃逸的(non-escaping)。...在Swift 3.1中,您可以使用新的函数withoutActuallyEscaping()将非逃逸换为临时逃逸。...f 与 g 进入函数后由非逃逸状态,分别转换为逃逸:escapableF和escapableG。 async(execute:) 的调用需要逃逸,我们在上面已经进行了转换。...通过运行sync(flags: .barrier),您确保async(execute:)方法完全完成,稍后将不会调用。 在范围内使用 escapableF and escapableG.

    2.5K50

    Apple Swift编程语言入门教程

    Swift是供iOS和OS X应用编程的新编程语言,基于C和Objective-C,而却没有C的一些兼容约束。Swift采用了安全的编程模式和添加现代的功能来是的编程更加简单、灵活和有趣。...Objective-C开发者会感到Swift的似曾相识。Swift采用了Objective-C的命名参数和动态对象模型。提供了对Cocoa框架和mix-and-match的互操作性。...他支持playground,允许程序员实验一段Swift代码功能并立即看到结果,而无需麻烦的构建和运行一个应用。 Swift集成了现代编程语言思想,以及Apple工程文化的智慧。...编写时有多种选项。当一个的类型是已知时,例如代表回调,你可以忽略其参数和返回值,或两者。单一语句的可以直接返回值。...子类的方法可以通过标记 override 重载超类中的实现,而没有 override 的会被编译器看作是错误。编译器也会检查那些没有被重载的方法。

    2K30

    Swift进阶一:Swift简介

    Swift语言引入了协议、协议的扩展、泛型等新特性,因此使用Swift语言可以很好地面向协议编程;Swift语言将函数和提升为语言的一等公民,函数可以作为一个变量、可以作为其他函数的参数、作为其他函数的返回值等来传递...如果代码中使用一个字符串String,那么你不能错误地传递一个整型Int给它,因为Swift是类型安全的,它会在代码编译的时候做类型检查,并且把所有不匹配的类型作为一个错误标记出来,这使得程序员在开发中尽可能早得发现和修正错误...而在Objective-C中,枚举则鸡肋很多,它只是一个标记值而已。 5,泛型 Swift中是支持泛型的,也支持泛型的类型约束等特性。 Objective-C中则没有泛型的概念。...很多时候,我们明明看到一个类遵循了某个协议,并且在该协议中定义了某方法,但是在运行的时候却因为找不到对应的方法而Crash,这就是因为该方法是optional的,并且在对应的类中没有实现该方法。...7,函数和Swift中,函数是一等公民,可以直接定义函数类型的变量,可以将函数作为其他函数的参数来传递,也可以将函数作为其他函数的返回值。这些特性可以让我们在Swift中进行函数式编程。

    2.8K20

    窥探Swift之函数与的应用实例

    说到函数,只要是写过程序就肯定知道函数是怎么回事,今天就来讨论一下Swift中的函数的特性以及Swift中的。今天的一些小实例中回类比一下Objective-C中的函数的写法等等。...而在Swift中的就是Objective-C中的Block, 除了语法不通外,两者的用法是一样的。废话少说,开始今天的主题,先搞一搞Swift中的函数,然后在搞一搞Swift中的。... 说道Swift中的呢,不得不提的就是Objective-C中的Block, 其实两者是一个东西,使用方式以及使用场景都是相同的。...我们完全可以类比着Objective-C中的Block来介绍一下Swift中的Closure()。其实就是匿名函数。...运行效果的截图如下: ? 4.数组中常用的函数 在Swift的数组中自带了一些比较好用的函数,例如Map, Filter, Reduce。接下来就好好的看一下这些,用起来还是比较爽的。

    1.9K50

    iPhone 激活量跌至六年来新低 | Swift 周报 issue 52

    Jeff Biggus 运行了相同的基准测试,并发现 Swift 代码使用的资源比Python代码少。...对话还涉及利用协议来解决与相关的挑战的想法,例如安全捕获可变变量和减少分配。 协议可以提供一种结构化的方式来确保对内可变状态的独占访问,从而有可能提高性能。...此外,还探索通过将换为可复制的结构来为注入值语义。 这种方法可以促进有状态和“可重新启动”操作的实现,尽管它可能需要特殊的语法来区分具有值或引用语义的。...还考虑了功能协议的替代方案,包括使更充分地参与泛型或将类型视为。 这些方法旨在简化代码组织和文档,同时使和协议更紧密地结合在一起。...总的来说,讨论反映了增强 Swift 表达能力并弥合和协议之间差距的愿望。 通过探索各种概念和替代方案,社区寻求以有利于开发人员并提高语言功能的方式发展 Swift

    26932

    Swift基础 嵌套

    Swift中的类似于C和Objective-C中的块以及其他编程语言中的lambdas。 可以从定义常量和变量的上下文中捕获和存储对任何常量和变量的引用。这被称为关闭这些常量和变量。...第一个是一个完成处理程序,在成功下载后显示图片。第二个是一个错误处理程序,向用户显示错误。...注意 作为优化,如果值没有突变,并且值在创建后没有突变,则可以捕获和存储该值的副本。 Swift 还负责处理不再需要的变量时涉及的所有内存管理。...如果您没有用@escaping标记此函数的参数,您将收到编译时错误。 如果self引用类的实例,则引用self的转义需要特殊考虑。在逃逸闭合中捕获self很容易意外地创建一个强大的参考周期。...这种语法便利性允许您通过编写正态表达式而不是显式来省略函数参数周围的大括号。 通常调用带有自动的函数,实现这类函数并不常见。

    12700

    了解 Swift 的 Result 类型

    我们通常使用throwing函数对此建模,因为如果函数调用成功,我们将获得数据,但是如果抛出错误,则将运行catch代码块,因此我们可以独立处理这两个函数。但是,如果函数调用没有立即返回怎么办?...如果您还记得的话,我说完成将把data或error设置为一个值——不能两者皆有,也不能两者都没有,因为这两种情况不会一起出现。...当我们将传递给函数时,Swift需要知道是立即使用它还是以后使用它。如果立即使用默认值——那么Swift很乐意运行。...但是,如果稍后使用它,则可能创建的已被销毁并且不再存在于内存中,在这种情况下,也将被销毁并且无法再运行。 为了解决这个问题,Swift让我们将参数标记为@escaping,这意味着: ?...对于我们的方法,我们将运行一些异步工作,然后在完成后调用。这可能立即发生,也可能需要几分钟。我们不在乎。关键是方法返回后,仍需要保留,这意味着我们需要将其标记为@escaping。

    2.6K20

    Swift 周报 第三十八期

    仅仅因为有人想不出保留静态类型信息的理由(通过使用特定的错误类型或使用匿名联合类型),并不意味着没有理由。...虽然 SE-0387 指定了 Swift SDK 捆绑的格式和文件系统布局,但它没有规定如何生成这些捆绑。...我认为它可以被删除的原因是,虽然这个确实被传递到事件循环线程,当它离开交易功能时,它正在等待 EventLoopFuture.get(),确保的函数调用完成。...实际上并没有逃脱。 上面的想法可能是对的吗? 我很想听听有更多见解的人的想法来权衡。...这样的作用域函数确实可以是异步的,但是,即使它们是异步的,在我看来,只要作用域函数中的执行是串行完成的,它们不一定必须是 @Sendable 或 @escaping。 你对此有何看法?

    22630

    【面试必备】Swift 面试题及其答案

    Objective-C中,引用类型的变量是可以缺少值得,并且使用nil作为缺少值。基本的数据类型如int 或者float没有这种功能。...在这种情况下,引用的一方可以标记为unowned,另一方使用隐式拆。 建议:除非必要,不要对option类型使用隐式拆。使用不当会增加运行时崩溃的可能性。...,因为它依赖于T类型本身,enum情况下需要一个固定大小的有效载荷。...问题2- Swift 1.0 or later 是引用类型吗? 答案:是引用类型。...如果一个包被分配给一个变量,这个变量复制给另一个变量,那么他们引用的是同一个,他们的捕捉列表也会被复制。 问题3- Swift 1.0 or later UInt类型是用来存储无符号整型的。

    2.8K20
    领券