相关疑难解决方法(0)

闭包与委托模式

我正在使用网络请求类,我担心崩溃.例如,在将回调方法传递给函数时,使用闭包非常简单:

// some network client
func executeHttpRequest(#callback: (success: Bool) -> Void) {
    // http request

    callback(true)
}

// View Controller
func reload() {
    networkClient.executeHttpRequest() { (success) -> Void in
        self.myLabel.text = "it succeeded" // NOTE THIS CALL
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,由于应该执行回调的进程是异步的,当回调与容器类元素(在本例中是一个UIKit类)交互时,它可能容易在类似的情况下崩溃

  1. 当异步任务仍在执行时,用户导航到另一个View Controller
  2. 用户在异步任务仍在执行时按下主页按钮
  3. 等等...

因此,当回调最终被触发时,self.myLabel.text可能会导致崩溃,因为self引用的View Controller 可能已经被释放.

到这一点.我是对的还是在内部快速实施某些内容以便永远不会发生这种情况?

如果我是正确的,那么当代理模式派上用场时,就像代理变量一样weak references,这意味着,如果取消分配,它们不会保留在内存中.

// some network client

// NOTE this variable is an OPTIONAL and it's also a WEAK REFERENCE
weak var delegate: …
Run Code Online (Sandbox Code Playgroud)

delegates closures ios swift

12
推荐指数
1
解决办法
5800
查看次数

我何时以及为什么要使用ARC将局部变量声明为__weak?

Mike Ash已将此介绍写入ARC,他在此介绍了以下内容:

__weak Foo *_weakFoo = [object foo];
Run Code Online (Sandbox Code Playgroud)

为什么我要为本地临时变量做这个?__weak是一个归零引用,只要引用的对象被释放,它就会自动将_weakFoo指针设置为nil.此外,__ weak仅在iOS> = 5时可用.

当我这么做时,我什么时候会遇到麻烦?:

Foo *_weakFoo = [object foo];
Run Code Online (Sandbox Code Playgroud)

总是希望返回一个对象或零.我的猜测是这样的:

Foo *_weakFoo = [object foo];
[self doSomethingStupid]; // does something bad so foo gets deallocated
[_weakFoo doIt]; // CRASH! msg sent to deallocated instance 0x123456
Run Code Online (Sandbox Code Playgroud)

ARC仍然让我感到困惑的一件事是:它何时知道我不再需要一个物体了?我认为当我设置一个指向nil或其他东西的指针时,它会发现此所有者不再需要先前引用的对象,因此可能会消失.但问题是:我把它设置为零.所以它无论如何都是零!

所以,当局部变量的__weak有意义时,我必须在其他地方做什么样的疯狂事情,以便我真的需要它?

iphone xcode weak-references ios automatic-ref-counting

5
推荐指数
1
解决办法
2561
查看次数

为什么操作队列中不需要[weak self]或[unowned self]?

在了解了Swift 的捕获列表以及如何使用它来避免保留循环之后,我不禁注意到一些令人费解的事情OperationQueue:它不需要[weak self]或 来[unowned self]防止内存泄漏。

class SomeManager {
    let queue = OperationQueue()
    let cache: NSCache = { () -> NSCache<AnyObject, AnyObject> in
        let cache = NSCache<AnyObject, AnyObject>()
        cache.name = "huaTham.TestOperationQueueRetainCycle.someManager.cache"
        cache.countLimit = 16
        return cache
    }()

    func addTask(a: Int) {
        queue.addOperation { // "[unowned self] in" not needed?
            self.cache.setObject(a as AnyObject, forKey: a as AnyObject)
            print("hello \(a)")
        }
    }
}

class ViewController: UIViewController {

    var someM: SomeManager? = SomeManager()

    override func viewDidLoad() …
Run Code Online (Sandbox Code Playgroud)

memory-leaks nsoperationqueue automatic-ref-counting retain-cycle swift

3
推荐指数
1
解决办法
2022
查看次数

目标c - 阻止保留周期

我有一个块保留周期问题,
假设我有以下3种方法,都在一个类中.

- (void)foo1WithBlock:(void (^)(BOOL success))completion
   // do something...
   completion(YES)
}  

- (void)foo2 {
   // do something...
}  

- (void)foo3 {
   [self foo1WithBlock:^(BOOL success) {
       [self foo2];
   }]; 
}
Run Code Online (Sandbox Code Playgroud)

foo3会创建一个保留周期吗?

iphone objective-c ios objective-c-blocks

2
推荐指数
1
解决办法
1905
查看次数