将观察者添加到runloop创建保留周期

时间:2017-05-30 03:34:50

标签: ios nsrunloop retain-cycle

let observer = CFRunLoopObserverCreateWithHandler(kCFAllocatorDefault, CFRunLoopActivity.BeforeWaiting.rawValue, false, 0, { (observer, activity) in

        self.doSomething()

    })

    CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, UITrackingRunLoopMode)

我在UIViewController中向主runloop添加一个观察者,这意味着self是UIViewController的一个实例。上面的代码创建了一个保留周期,导致控制器永远不会被释放。

我知道我可以为块声明[弱自我]或[无主自我]来解决问题。我想问一下retian周期到底是什么样的?我只知道该块通过强大的参考来捕获自我。

2 个答案:

答案 0 :(得分:0)

您的问题代码中没有保留周期。

  • 运行循环保留观察者。
  • 观察员保留该区块。
  • 该块保留self

这不是保留周期。

但是,如果将observer存储在strong实例变量中,那么您有一个保留周期:

  • self保留观察员。
  • 观察员保留该区块。
  • 该块保留self

答案 1 :(得分:0)

如果你在" Debug Memory Graph"与" Malloc Stack"打开功能(" Malloc Scribble"减少误报),您将看到视图控制器上挂着的内容:

enter image description here

因为我们打开了" Malloc Stack"功能,您可以单击右侧的堆栈,它将直接转到建立强引用的代码。

如果您想要查看更多传统的强参考周期图,您可以对观察者保持强烈的参考:

<?php
if (isset($_POST['postupdate'])) {

    $editPostTitle = trim($_POST['editposttitle']);
    $editPostAuthor = trim($_POST['editpostauthor']);
    $editPostStatus = trim($_POST['editpoststatus']);
    $editPostTags = trim($_POST['editposttags']);
    $post_image = $_FILES['editimage']['name'];
    $post_image_temp = $_FILES['editimage']['tmp_name'];
    $editPostContent = trim($_POST['editpostcontent']);

    move_uploaded_file($post_image_temp, "./images/".$post_image);
    print_r(error_get_last());

    $updateposts = $conn->prepare("
    UPDATE posts 
    SET post_title = ?, post_author = ?, post_tags = ?, post_image = ?, post_content = ?
    WHERE post_id = ?
    ");
    $updateposts->bind_param("sssssi", $editPostTitle, $editPostAuthor, $editPostTags, $editPostImage, $editPostContent, $editId);
    $updateposts->execute();
    $updateposts->close();



}

然后,您可以在运行时错误中看到实际的强参考周期更清楚地说明:

enter image description here

但是,即使你的第一个例子是保持对视图控制器的强引用,但是&#34;调试内存图&#34;虽然它显示了强引用,却很难找到根的循环(即挂在它上面的运行循环),所以你不会看到漂亮的循环图。但它仍然显示问题,但不是运行时错误。

&#34;调试内存图&#34; WWDC 2016 Visual Debugging with Xcode中概述的功能,从该视频开始大约24分钟开始,将向您展示如何诊断这些问题。