相关疑难解决方法(0)

当Leaks仪器没有显示时,如何调试内存泄漏?

我有一个用Swift写的iOS应用程序泄漏内存 - 在某些情况下应该释放一些对象,但事实并非如此.我通过简单地添加如下deinit调试消息来了解这个问题:

deinit {
    println("DEINIT: KeysProvider released")
}
Run Code Online (Sandbox Code Playgroud)

因此,在应该导致对象释放的此类事件之后,deinit消息应该存在于控制台中.但是,对于应该释放的某些对象,消息将丢失.仍然,Leaks Developer Tool没有显示任何泄漏.我该如何解决这种情况?

memory-leaks memory-management ios automatic-ref-counting swift

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

弱者自己去哪儿了?

我经常这样做,

let when = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: when) {
   beep()
}
Run Code Online (Sandbox Code Playgroud)

在一个应用程序中,我们经常这样做

tickle.fresh(){
    msg in
    paint()
}
Run Code Online (Sandbox Code Playgroud)

但如果你做这个

let when = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: when) {
   tickle.fresh(){
      msg in
      paint()
   }
}
Run Code Online (Sandbox Code Playgroud)

当然,你必须做这个

let when = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: when) { [weak self] _ in
   tickle.fresh(){
      msg in
      self?.paint()
   }
}
Run Code Online (Sandbox Code Playgroud)

或者,也许这个

let when = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: when) {
   tickle.fresh(){
      [weak self] msg in
      self?.paint()
   }
}
Run Code Online (Sandbox Code Playgroud)

或许这个

let when = DispatchTime.now() …
Run Code Online (Sandbox Code Playgroud)

weak-references swift

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

是否有必要在UIView.animateWithDuration(...)的闭包中使用[unowned self]?

    UIView.animateWithDuration(1,
        animations: { [unowned self] in
            self.box.center = self.boxTopRightPosition
        },
        completion: { [unowned self] completed in
            self.box.hidden = true
    })
Run Code Online (Sandbox Code Playgroud)

是否有必要避免内存泄漏?

memory closures ios swift

35
推荐指数
5
解决办法
8543
查看次数

是否需要在单例类中使用弱引用?

我遇到了raywenderlich的一个教程,作者为处理单例中的线程问题提供了一些很好的技巧。但是,当使用单例类中的闭包时,他使用的是“弱”引用循环。确实需要这样做吗,因为类是单例的,所以应该总是有一个实例?

    final class PhotoManager {
      private init() {}
      static let shared = PhotoManager()

      private var unsafePhotos: [Photo] = []

    let concurrentPhotoQueue = DispatchQueue(label: "com.jeesson.googlypuff.photoQueue", attributes: .concurrent)
      var photos: [Photo] {
        var photoCopy:[Photo]!    
        concurrentPhotoQueue.sync {
            photoCopy = self.unsafePhotos
        }
        return photoCopy
      }

      func addPhoto(_ photo: Photo) {

// Do we need 'weak self here.. and why?
        concurrentPhotoQueue.async(flags: .barrier) {[weak self] in
            // 1
            guard let self = self else {
                return
            }
            self.unsafePhotos.append(photo)
            DispatchQueue.main.async { [weak self] in
                //self?.postContentAddedNotification()
            }
        } …
Run Code Online (Sandbox Code Playgroud)

singleton memory-management weak-references grand-central-dispatch swift

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