我正在使用网络请求类,我担心崩溃.例如,在将回调方法传递给函数时,使用闭包非常简单:
// 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类)交互时,它可能容易在类似的情况下崩溃
因此,当回调最终被触发时,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) 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有意义时,我必须在其他地方做什么样的疯狂事情,以便我真的需要它?
在了解了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种方法,都在一个类中.
- (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会创建一个保留周期吗?
ios ×3
iphone ×2
swift ×2
closures ×1
delegates ×1
memory-leaks ×1
objective-c ×1
retain-cycle ×1
xcode ×1