问题标签 [retain-cycle]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
955 浏览

ios - [Not A Type retain]:消息发送到已释放实例,目标 c

我正在使用渐变自定义视图并通过执行以下操作在其上添加 uilabel:

当我在模拟器中运行时,一切都按我的预期运行。但是,当我在设备上安装时,应用程序崩溃并且我得到

你有什么想法为什么我会遇到这个问题?

0 投票
1 回答
57 浏览

ios - 方块挡住了我的视线

假设我这样做:

然后 xcode 将奖励我此错误:在此块中强烈捕获 vista 可能会导致保留周期

有人建议像这样声明远景

但问题是这样的。vista 变量被分配给向下几行的属性。

这是一个非原子的强属性。

我该如何解决?我可以声明一个临时 id var 来使用它,但这似乎是一个蹩脚的解决方案。

任何想法?

0 投票
3 回答
2543 浏览

ios5 - 核心数据 - 打破父上下文的保留周期

假设我们在核心数据模型中有两个实体:部门和员工。
部门与员工是一对多的关系。

我有以下 ManagedObjectContexts:
- Root:连接到 Persistent Store Coordinator
- Main:与父 Root 的上下文

当我想创建一个员工时,我执行以下操作:
- 我在主上下文中有一个部门 - 我在主上下文中
创建一个员工
- 我将部门分配给员工的部门属性
- 我保存主上下文
- 我保存根上下文

这会在 Main 上下文和 Root 上下文中创建一个保留循环。

如果我在没有子上下文的情况下执行此操作(全部在 Root 上下文中),那么我可以通过调用refreshObject:mergeChangesEmployee 来打破保留循环。在我使用这两个上下文的情况下,我仍然可以使用该方法来打破 Main 上下文的循环,但我将如何打破 Root 上下文的循环?

旁注:这是一个描述我的问题的简单示例。在 Instruments 中,我可以清楚地看到分配的数量在增长。在我的应用程序中,我的上下文比一层更深,导致了更大的问题,因为我得到了一个新的实体分配,每个上下文都有保留周期,我正在保存。

15/04 更新:NSPrivateQueueConcurrencyType 与 NSMainQueueConcurrencyType
保存两个上下文后,我可以refreshObject:mergeChanges使用 Department 对象在 Main 上下文上执行。正如预期的那样,这将重新故障部门对象,打破保留周期并在该上下文中取消分配部门和员工实体。

下一步是打破存在于 Root 上下文中的保留循环(保存 Main 上下文已将实体传播到 Root 上下文)。我可以在这里做同样的技巧,并refreshObject:mergeChanges在带有 Department 对象的 Root 上下文中使用。

奇怪的是:当我的根上下文是用 NSMainQueueConcurrencyType 创建的(所有分配都重新出错并解除分配)时,这工作正常,但是当我的根上下文是用 NSPrivateQueueConcurrencyType 创建时不起作用(所有分配都重新出错,但没有解除分配)。

旁注:根上下文的所有操作都在 performBlock(AndWait) 调用中完成

更新 15/04:第 2 部分
当我使用 NSPrivateQueueConcurrencyType 在根上下文上执行另一个(无用,因为没有更改)保存或回滚时,对象似乎已被释放。我不明白为什么这与 NSMainQueueConcurrencyType 的行为不同。

16/04 更新:演示项目
我创建了一个演示项目:http ://codegazer.com/code/CoreDataTest.zip

21/04 更新:到达那里
谢谢 Jody Hagings 的帮助!
我正在尝试refreshObject:mergeChanges移出我的 ManagedObjectdidSave方法。

您能否向我解释一下两者之间的区别:

顶部的不会释放对象,底部的会。

0 投票
1 回答
533 浏览

cocoa - NSOutlineView/NSTreeController 删除后没有释放所有模型对象

我有一个非常基本的应用程序:一个NSOutlineView绑定到NSTreeController. 大纲视图显示一个简单的模型对象 ( TCCard)。我添加了两个按钮,以便可以在大纲视图中添加和删除模型对象。

查看 Instruments (Leaks) 中的应用程序,我可以看到我的模型对象的新实例是在我添加它们时创建的,但当我从大纲视图中删除它们时,并不是所有实例都被释放。即使大纲视图没有更多条目,我的模型对象的两个或三个实例也始终保持“活动”状态。

大纲视图或树控制器是否在幕后进行一些缓存?下面的代码:

这是一个非常基本的例子。在我的真实应用程序中,这些模型对象非常“沉重”,并有很多对其他对象的引用。我真的希望在将它们从视图中删除时将它们全部释放。

编辑:即使使用 Apple 的示例代码也可以重现此问题:https ://developer.apple.com/library/mac/#samplecode/DragNDropOutlineView/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008831

在 Instruments 中的示例中运行并搜索SimpleNodeData. 观察实例的数量,然后从示例应用程序中删除所有节点(通过上下文菜单)。

0 投票
2 回答
333 浏览

objective-c - 故意创建保留循环(没有 GC 的目标 C)

有没有一种情况是故意创建一个保留周期来防止重新分配,然后再清理它,这是解决问题的最佳方法吗?

如果是这样,在 Cocoa Touch 或 NextStep 框架中是否有这样的例子?

我打算让这个问题专门针对带有 ARC 的 Objective C,因为带有 GC 的 Objective C 或其他带有 GC 的语言可能表现不同。

0 投票
2 回答
2362 浏览

objective-c - 在块/块中使用弱自我时的 EXC_BAD_ACCESS

我一直在为这个问题苦苦挣扎,因为我认为我不完全理解保留周期。我对此完全陌生,我正在尝试更多地了解它。

我收到带有以下代码的 EXC_BAD_ACCESS 消息。

我开始使用weakSelf,因为如果我只使用self.successBLock(); 就会收到2 个关于保留周期的警告。确切的警告是:

也许我什至不应该打扰使用弱者,但我对此不太确定。

这是我在一个块中使用weakSelf的部分:

这就是我分配块属性的方式:

0 投票
1 回答
234 浏览

objective-c - 我是否在 UIViewController 和自定义对象之间创建了一个保留周期?

在使用 ARC 的项目中,我有一个UIViewController处理太多问题的问题,所以我想把事情分开。对我来说,一件显而易见的事情是一种格式化和发送电子邮件的方法,并将其拆分为一个单独的对象。

我的控制器目前处理MFMailComposeViewControllerDelegate协议,因为在成功发送电子邮件后,我还有一些额外的工作要做。

我的问题是,如果控制器用作发送电子邮件的单独对象,并且我给它一个指向控制器的指针以用作MFMailComposeViewController mailComposeDelegate,我会创建一个问题 - 特别是保留周期吗?

如果是这样,在这种情况下有什么更好的方法?将指向控制器的属性设置为弱就足够了吗?

0 投票
10 回答
24481 浏览

objective-c - 对 NSTimer 目标的弱引用以防止保留循环

我正在使用NSTimer这样的:

当然,NSTimer保留创建保留循环的目标。此外,self它不是 UIViewController,所以我没有任何类似的东西viewDidUnload可以使计时器无效以打破循环。所以我想知道是否可以使用弱引用:

我听说计时器必须无效(我想从运行循环中释放它)。但是我们可以在我们的 dealloc 中做到这一点,对吧?

这是一个可行的选择吗?我见过很多人们处理这个问题的方法,但我还没有看到这个。

0 投票
1 回答
93 浏览

iphone - Apple decumentation 在块中的对象上

苹果关于此事的文档指出:

复制块时,它会创建对块内使用的对象变量的强引用。如果在方法的实现中使用块:

如果通过引用访问实例变量,则会对 self 进行强引用;

如果您按值访问实例变量,则会对该变量进行强引用。

并且有代码示例:

但对我来说这毫无意义。如何按值访问实例变量?您不是总是通过引用访问它吗?无论是它self.myVariable还是只是id newName = self.myVariable,它总是被引用。

那么这个例子不是太清楚他们的意思。为什么在第一种情况下是自我保留而在第二种情况下不是?它没有在任何地方使用,那么为什么要阻止捕获它呢?

0 投票
2 回答
19081 浏览

ios - Capturing 'self' strongly in this block is likely to lead to a retain cycle

I have reqest with block. But the compiler issues a warning

"Capturing 'self' strongly in this block is likely to lead to a retain cycle"

I try example write like weakSelf.generalInstaImage, but then the compiler generates an error and do not compile.