标签: deinit

Deinit从未打电话过

我正在创建一个ViewController对象,将其推送到导航控制器.当从堆栈弹出对象时 - 它没有被释放而Deinit没有被调用.可能是什么原因?

这是推送的代码:

self.navigationController?.pushViewController(CustomViewController(), animated: true)
Run Code Online (Sandbox Code Playgroud)

这是弹出的代码:

 self.navigationController?.popViewControllerAnimated(true)
Run Code Online (Sandbox Code Playgroud)

uinavigationcontroller swift deinit

48
推荐指数
8
解决办法
5万
查看次数

在转换到SpriteKit中的另一个SKScene之后释放SKScene

我有一个视图控制器,有三个skscenes作为孩子.

当我从一个过渡到另一个时,旧的skscene不会被解除分配.

我希望它能够被解除分配,好像它永远不会存在一样.

例:

当我第一次加载应用程序时,只有1个skscene可见(假设它占用100mb内存),然后我转换到另一个(100mb以上),然后是第三个(300mb内存).

我最终会得到300mb内存,而且我希望在任何时候都有100个内存.

我怎样才能做到这一点?

My view controller: 

//
//  ViewController.m
//  Paddle Jumper
//
//  Created by Chance Daniel on 1/18/14.
//  Copyright (c) 2014 Max Hudson. All rights reserved.
//

#import "Flurry.h"
#import "ViewController.h"
#import "startViewController.h"

@implementation ViewController{
    BOOL sceneSetUp;
}

- (void)viewWillLayoutSubviews
{
    if(!sceneSetUp){

        [super viewWillLayoutSubviews];

        // Configure the view.
        SKView * skView = (SKView *)self.view;
        //skView.showsFPS = YES;
        //skView.showsNodeCount = YES;

        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        if([[defaults objectForKey:@"firstTime"] intValue] != 1){
            [defaults setObject:[NSNumber numberWithInt:1] …
Run Code Online (Sandbox Code Playgroud)

objective-c ios sprite-kit swift deinit

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

Swift的deinit没有被调用

private let DBItemCellIdentifier = "ItemCellIdentifier"
private let DBItemSegueIdentifier = "ItemSegueIdentifier"

class DBItemsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, DBItemTableViewCellDelegate {

    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var previousButton: UIButton!
    @IBOutlet weak var nextButton: UIButton!
    @IBOutlet weak var categoryNameLabel: UILabel!

    private var elements = [Any]()
    private var currentItemIndex = 0
    private var isFetching = false

    private weak var currentCategory: DBCategory? {

        didSet {
            updateView()
        }
    }

    var categories = [DBCategory]()
    var currentCategoryIndex = 0

    //MARK: - Class Methods

    //MARK: - Initialization

    override func …
Run Code Online (Sandbox Code Playgroud)

memory-management swift deinit

11
推荐指数
1
解决办法
9905
查看次数

我可以在deinit中使用didSet吗?

我在我的类中添加了一个Timer变量,并使用其didSet观察器使旧值无效

var timer: Timer? {
    didSet { oldValue?.invalidate() }
}

deinit {
    timer = nil
}
Run Code Online (Sandbox Code Playgroud)

我认为这样就足以在类被取消初始化时使计时器无效,但看起来似乎没有调用didSet.这是为什么?观察员在去初始化期间不工作吗?

swift deinit property-observer

11
推荐指数
1
解决办法
289
查看次数

iOS无法删除通知观察者.Deinit没有被召唤

我有一个类似你可以在下面看到的UIView:

class ViewTaskViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
override func viewDidLoad() {
    super.viewDidLoad()
    subscribeToNotifications()
}

func subscribeToNotifications() {
    let notification = NotificationCenter.default
    notification.addObserver(forName: Notification.Name(rawValue: "TimerUpdated"), object: nil, queue: nil, using: handleUpdateTimer)
    print("Subscribed to NotificationCenter in ViewTaskViewController")
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    print("TUFU TUFU TUFU")
    NotificationCenter.default.removeObserver(self)
}

deinit {
    print("DENINT")
}

@objc func handleUpdateTimer(notification: Notification) {
    if let userInfo = notification.userInfo, let timeInSeconds = userInfo["timeInSeconds"] as? Int {

        withUnsafePointer(to: &self.view) {
            print("We got timeeeeee \(timeInSeconds) \($0)")
        }

       //do something …
Run Code Online (Sandbox Code Playgroud)

memory-leaks nsnotification ios swift deinit

8
推荐指数
1
解决办法
2001
查看次数

从未调用过UITableViewCell对象deinit

问题出在我的项目中。但是我也在新的xcode草案项目中尝试了Master-Detail Application。

我创建了基本Cell类,并将该单元映射到情节提要上。删除操作后,不会调用deinit。没有关于单元格的强项或弱项。

class Cell:UITableViewCell {
    deinit{
        print("Deinit Called")
    }
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! Cell

    let object = objects[indexPath.row] as! NSDate
    cell.textLabel!.text = object.description
    return cell
}
Run Code Online (Sandbox Code Playgroud)

memory-management uitableview swift deinit

6
推荐指数
1
解决办法
3639
查看次数

如何在 swift 中的类定义中调用 deinit 方法

我想定义一个方法,当该类中的变量增加到某个值时,该方法可以销毁它所属的实例。我尝试做类似以下的事情:

 var calledTimes = 0 //some other method would update this value

 func shouldDestroySelf(){
   if calledTimes == MAX_TIMES {
     denit
   }
 } 
Run Code Online (Sandbox Code Playgroud)

但我会收到错误消息“Expect '{' for deinitializers”。

班级里有没有自毁的事情?

swift deinit

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

UISplitViewController:在折叠模式下Deinit DetailView

我一直在努力解决这个问题,但是我无法找到解决方案:

我有一个支持所有设备系列的iOS 9应用程序,使用大小类并使用Swift 2.0进行编程.我正在使用a UISplitViewController,一切都按照我的要求工作,除了在崩溃的环境中(例如在iPhone上).

Master-ViewController是在UITableViewController选择单元格时触发替换segue的.在折叠环境中,这意味着detailViewcontroller被推送到屏幕上.在UISplitViewController视觉上表现有点像UINavigationController.但是,当我使用后退按钮或滑动手势关闭detailViewController时,在Master-ViewController中触发新的替换segue之前,它不会被释放.

我认为这是一个特征UISplitViewController,因为它最初设计为显示彼此相邻的两个内容.然而,在崩溃的环境中,我希望我UISplitViewController的行为像一个简单的UINavigationController,在弹出时释放先前推送的detailviewController.

viewControllers在弹出detailViewController后,我一直在尝试手动更改splitViewController的属性:

 if let firstVc = self.splitViewController?.viewControllers.first {
        self.splitViewController?.viewControllers = [firstVc]
 }
Run Code Online (Sandbox Code Playgroud)

但这没有用.简单地用一个空的"Dummy"-ViewController替换detailViewController也不起作用,因为它会自动动画转换.和UISplitViewControllerDelegate我一起玩并没有帮助我...

有没有解决方案(也许简单?:)),我太盲目了?

dealloc uisplitviewcontroller ios deinit

5
推荐指数
0
解决办法
375
查看次数

为什么在 UIView 再次添加到父级之前不会调用 deinit?

我有一个 UIView 正在添加到 UIViewController 并且通常正在测试取消初始化以确保我做对了。但是当我没有将 viewController 中的变量设置为 nil 并且只使用 .removeFromSuperView() 时,UIView 中的 deinit() 方法不会被调用,直到我再次添加 UIView 然后调用它。但是,如果我使用 removeFromSuperView() 并将变量设置为 nil,则会立即调用 deinit()。这是为什么?

这是 UIView() 类:

class TestView: UIView {

    override init(frame: CGRect) {
        super.init(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
        print("init is happneing")
    }

    deinit {
        print("de init is happneing")
    }


    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
Run Code Online (Sandbox Code Playgroud)

这是父 ViewController :

class MyViewController: UIViewController { 
 var tstview  : TestView?


  //adding the UIView by tapping on …
Run Code Online (Sandbox Code Playgroud)

memory memory-leaks swift deinit swift3

4
推荐指数
1
解决办法
4117
查看次数

参考类型内部值类型

我正在探索Swift值类型特别是结构,以便更好地理解它在不同场景中的用途.我很惊讶地看到如何使用枚举来构建二进制搜索树,使用indirect它可以引入一层薄薄的引用语义.

enum BinarySearchTree<T: Comparable> {
  case empty
  case leaf(T)
  indirect case node(BinarySearchTree, T, BinarySearchTree)
}
Run Code Online (Sandbox Code Playgroud)

现在提出真正的问题,我正在努力寻找的是,在值类型中引用类型会发生什么.这段关系将如何运作?像内存管理,对象生命周期.

例如

class B {
    var data: Int = 0

    deinit {
        print("deallocated!")
    }

}

struct A {
    var b = B()
}
Run Code Online (Sandbox Code Playgroud)

在上述情况下,值类型包含对引用类型的引用.

  1. 何时deinit会被召唤?
  2. 每个类型的新结构实例是否都会A引用同一个类实例,B或者它们是不同的.
  3. 我需要注意什么,或者是代码味道?
  4. 还要别的吗?

memory-management value-type reference-type swift deinit

4
推荐指数
1
解决办法
1250
查看次数