我正在创建一个ViewController对象,将其推送到导航控制器.当从堆栈弹出对象时 - 它没有被释放而Deinit没有被调用.可能是什么原因?
这是推送的代码:
self.navigationController?.pushViewController(CustomViewController(), animated: true)
Run Code Online (Sandbox Code Playgroud)
这是弹出的代码:
self.navigationController?.popViewControllerAnimated(true)
Run Code Online (Sandbox Code Playgroud) 我有一个视图控制器,有三个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) 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) 我在我的类中添加了一个Timer变量,并使用其didSet观察器使旧值无效
var timer: Timer? {
didSet { oldValue?.invalidate() }
}
deinit {
timer = nil
}
Run Code Online (Sandbox Code Playgroud)
我认为这样就足以在类被取消初始化时使计时器无效,但看起来似乎没有调用didSet.这是为什么?观察员在去初始化期间不工作吗?
我有一个类似你可以在下面看到的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) 问题出在我的项目中。但是我也在新的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) 我想定义一个方法,当该类中的变量增加到某个值时,该方法可以销毁它所属的实例。我尝试做类似以下的事情:
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”。
班级里有没有自毁的事情?
我一直在努力解决这个问题,但是我无法找到解决方案:
我有一个支持所有设备系列的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我一起玩并没有帮助我...
有没有解决方案(也许简单?:)),我太盲目了?
我有一个 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) 我正在探索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)
在上述情况下,值类型包含对引用类型的引用.
deinit会被召唤?A引用同一个类实例,B或者它们是不同的. deinit ×10
swift ×9
ios ×3
memory-leaks ×2
dealloc ×1
memory ×1
objective-c ×1
sprite-kit ×1
swift3 ×1
uitableview ×1
value-type ×1