草庐IT

retain-cycle

全部标签

swift - 这段 Swift 代码应该会产生内存泄漏,但实际上并没有。有人可以指出为什么吗?

我想我知道Swift上的循环保留是什么,以及它为什么会产生内存泄漏。但我写了一个小例子来演示它,似乎代码无论如何都被正确地释放了。在这个例子中,我有两个相互保留的对象(创建循环保留),第三个对象强烈持有这两个对象。我希望这第三个对象也无法解除分配,但事实并非如此。相互保留的两个对象:classObj1:NSObject{varobjc2:Obj2?deinit{print("Obj1Deinit")}}classObj2:NSObject{varobj1:Obj1?deinit{print("Obj2Deinit")}}容器:classContainer{varobj1:Obj1?va

swift - 为什么调用UIDynamicBehavior的action closure后会出现memory leak/retain cycle?

此处代码的想法是在View(self.mv)被UIDynamicAnimator设置为动画离开屏幕时删除它。下面的代码基于MattNeuburg着的iOS12编程一书第4章中的示例。作者说行为和View(代码中的self.mv)都不会被取消分配。但他没有详细说明这一点。我的问题是:谁在self.anim.removeAllBehaviors()之后仍然保留行为?谁还保留着self.mv?我使用了Instruments,但我不太了解输出结果。这是否意味着动画师保留了它?但是只有绿色的复选标记。通过XCode中的“DebugMemoryGraph”工具,我看到UIGravityBehavi

swift - 为什么我在第二个例子中得到保留圈?

为什么我们在第二个例子中得到了强引用圈,为什么我们在第一个例子中没有?classTest1{varname:String="Ted"lazyvargreeting={return"Hello\(self.name)"}()deinit{print("goodby1")}//Noretaincyclehere..}varv1:Test1?=Test1()v1?.greetingv1=nil//printsgoodby1,dealocationdoneclassTest{varname:String="Mery"lazyvargreeting={return"Hello\(self.nam

ios - 如何调查 ios 中的内存泄漏?

我创建了一个简单的流程来测试iOS应用程序中的内存。我在导航堆栈中有两个ViewController。我在第一个ViewController中显示一个警报,以允许用户移动到下一个。以下是我正在使用的代码。classViewController:UIViewController{@IBOutletweakvarlabelInfo:UILabel!overridefuncviewDidLoad(){super.viewDidLoad()}@IBActionfuncshowNextScreen(_sender:Any){letalert=UIAlertController(title:"Al

objective-c - Swift 数组会保留它们的元素吗?

我正在移植我的objective-c框架的一部分,其中我有用于观察目的的自定义MyNotificationCenter类。该类有一个NSArray类型的属性,其中包含所有对通知感兴趣的可观察对象。在objective-c中,一个数组会保留它的元素,这是不需要的,因为当中心试图通知他时观察者可能已经不存在了,而你不希望有保留周期。因此我使用了这段代码,它保留了数组中的所有项目而不保留它们:_observers=CFBridgingRelease(CFArrayCreateMutable(NULL,0,NULL));我知道Swift是一个不同的野兽,但是Swift中有这样的概念吗?

arrays - 在 Swift 中使用委托(delegate)数组时如何避免保留循环

这个问题在这里已经有了答案:UsingasaconcretetypeconformingtoprotocolAnyObjectisnotsupported(6个答案)关闭5年前。在我的一个类(class)中,我使用了一组委托(delegate)(该类(class)是一个单例)。这会导致保留周期。我知道当我只使用一个委托(delegate)时,我可以通过弱化委托(delegate)来避免保留周期。但这不适用于我的委托(delegate)数组。我怎样才能避免这个保留周期。例子:protocolSomeDelegate:class{funcsomeFunction()}我的类(class)c

ios - 处理URLSession时是否总是需要[Weak self]?

我不知道在这种情况下是否需要使用[weakself]?HTTPClient.swift:structHTTPClient{letsession=URLSession.sharedfuncget(url:URL,completion:@escaping(Data)->Void){session.dataTask(with:url){data,urlResponse,errorincompletion(data)//assumeeverythingwillgowell}.resume()}}服务.swiftstructService{lethttpClient:HTTPClientinit

swift - 闭包和静态函数

我有一个ViewModel类,其方法如下:funcgetUserSettings(){UserSettingsManager.getInfo{(result,error)iniferror==nil{self.userData=result}}}这个类viewModel被实例化,然后viewModel.getUserSettings()被调用。这种方法正在调用一个static方法UserSettings.getInfo传递一个@escaping闭包作为完成调用。该闭包正在捕获viewModel(它在其主体中使用self)。调用static方法对内存有什么影响?未实例化的UserSett

ios - 内存管理 : retain cycle with weak var, 无主的非保留周期。为什么?

长话短说我有一个结构和一个类。该结构具有对该类实例的引用,并且该对象具有捕获该结构的闭包。如果对对象的引用是unowned,那么它们似乎都被取消了初始化。如果对对象的引用弱,它们会相互保留。为什么?我有一个可以相互引用的结构和一个类,我试图找出保留循环和打破它们的方法。所以我在playground上玩了一会儿。给定这段代码:structA{unownedvarb:Binit(b:B){self.b=b}funcsetup(){print("Asetup")b.didSomethingClosure={print("A:bdiddosomething")self.printSomethi

objective-c - 转义闭包是如何在 Swift 3 中实现的(底层)?它们是否像在 objective-c 中那样隐式地 block_copied/retained?

我想了解转义闭包在Swift3中是如何工作的?来自Objective-C世界,对于闭包可以逃避其封闭函数返回的场景,您必须按照以下思路做一些事情:@property(nonatomic,copy/strong)void(^callback)(NSData*rawData);-(BOOL)someFunctionThatConsumesABlock:(void(^)(NSData*rawData))block{if(callback){self.callback=block;returnYES;}returnNO;}-(void)someFunctionThatExecutesAtSom