标签: init

在Objective-C中自定义init方法,如何避免递归?

我想创建一个UINavigationController的子类,它总是以相同的根控制器开始.没什么特别的,所以(对我来说)覆盖这样的init方法是完全合理的:

- (id) init {
   rootController = [[MyController alloc] init];

   if (self = [super initWithRootViewController:rootController]) {
       // do some more initialization
   }

   return self;
}
Run Code Online (Sandbox Code Playgroud)

这显然会产生一个问题,因为[super initWithRootViewController]将调用[UINavigationController init],这当然是我们重写的init方法,因此将发生无限递归.

我不想创建一个名为"initCustom"的不同名称的init方法.

目前我只能提出一个解决方案,但我真的讨厌这种黑客攻击:

- (id) init {
   if (initCalled)
       return self;

   initCalled = YES;

   rootController = [[MyController alloc] init];

   if (self = [super initWithRootViewController:rootController]) {
       // do some more initialization
   }

   return self;
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:有更好的方法来处理这个问题吗?我确定我错过了一些非常明显的东西,但我没有看到它.

编辑:我想这样做的原因,我可以在下面的评论中看到:

我想创建一个始终以特定视图控制器开始的导航控制器.我想把这个隐藏在班级的消费者手中.无需暴露不需要暴露的东西.让生活变得更轻松,编码更清晰(封装发明的原因之一,对吧?)

iphone cocoa-touch objective-c init uikit

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

需要帮助理解python中的"TypeError:default __new__不带参数"错误

出于某种原因,我无法左右让我的头__init____new__.我有一堆从终端运行良好的代码,但当我将其作为Google快速搜索框的插件加载时,我收到错误TypeError: default __new__ takes no parameters.

我一直在读这个错误,这让我的脑子旋转起来.目前我有3个类,没有子类,每个类都有自己def的类.我从不使用def __init__def __new__,但我已经明确感觉这些是给我错误的功能(或缺少它).

我不知道如何将代码汇总到一个在这里有用的代码片段,因为我有点过头,但整个脚本都可以在github上找到.不要指望任何人为我修改我的代码,我只是在我的智慧结束.一个简单的(简单的英语,而不是python文档的引用,我已经阅读了20次,但仍然没有真正理解)探索为什么会出现这个错误,或者为什么我应该,或者不是,使用__init__和/或__new__功能将得到认真的赞赏.

python init typeerror

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

为init运行python文件的Linux内核

使用内置或可从内核访问的python解释器来构建Linux内核是否可能并且并不难以置信,它可以运行python文件作为init进程?

python linux kernel init

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

git init - 关于git 1.5.4.3

我们的服务器上有git 1.5.4.3(2008年2月的版本).看来,当时没有选择--bare.

那我怎么能创建一个裸存储库呢?

在本地创建它并将其scp到服务器将是一种选择,但需要付出太多努力.或者是否可以使用本地 git命令创建新的远程存储库

git init git-bare

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

Python新手:任何人都知道__init __(self)的作用是什么?(简单的探索.拜托!)

可能重复:
Python init和self他们做了什么?

任何人都可以解释一下__init__(self)吗?我一直在读其他问题和人们提到超级课程?什么是超级课程?我认为程序应该从一开始

def print_word(word):
    print word
Run Code Online (Sandbox Code Playgroud)

__init__(self)某种特殊情况,因为它有下划线和"自我"吗?抱歉没有具体的术语......还在学习.

python init self

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

Android系统服务在哪里启动?

它说,在嵌入式Android这本书中

在init.rc中,只有一个操作会导致执行命令.服务声明仅用于描述服务,它们实际上并不启动任何内容......(第246页).

那么,Android系统服务(例如servicemanager,vold)在哪里开始?我以为它们是通过以下几行在init.rc中启动的.但根据这本书,我错了.

service servicemanager \/system/bin/servicemanager

service vold /system/bin/vold
Run Code Online (Sandbox Code Playgroud)

android platform init

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

为什么kthread有pid 2而systemd有PID 1?

在systemd环境中,当我执行ps -auxf时,我看到kthread的PID为2,而systemd分配了PID 1.

那么,谁将PID 2分配给kthread,为什么当kthread被称为systemd时它会获得PID 2 ?

linux kernel init systemd

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

Android Init启动-Ueventd和watchdogd

我是一个初学者,我想了解Kernel-Android界面。

system / core / init / init.c中,初始部分具有以下代码。

if (!strcmp(basename(argv[0]), "ueventd"))
        return ueventd_main(argc, argv);

if (!strcmp(basename(argv[0]), "watchdogd"))
        return watchdogd_main(argc, argv);
Run Code Online (Sandbox Code Playgroud)

接下来是对电路板特定init.rc文件的解析。

ueventd_main解析板特有uevent.rc的文件。

watchdogd_main试图设置逾时则保持写一个空字符到/dev/watchdog一个无限循环。

在Karim Yaghmour撰写的《嵌入式Android》一书中,提到的是:

init做的第一件事就是检查它是否是作为ueventd调用的。初始化包括udev hotplug事件处理程序的实现。因为此代码是在init自己的代码中编译的,所以init检查用于调用它的命令行,如果通过/ sbin / ueventd符号链接到/ init调用了它,则init立即作为ueventd运行。

我的问题是

1)我相信这个主函数的参数是从内核bootcmd参数“ init =”接收的。我对吗?

2)在哪种情况下,将调用initd或watchdogd运行的init?

3)通过符号链接到/ init意味着什么?

embedded android init

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

快速便捷初始化和通用类

我在创建方便的init方法时遇到问题,该方法随后在具有泛型类型参数的类上调用指定的init。这是Swift 3.1 XCode版本8.3.2(8E2002)游乐场

protocol A {
    var items: [String] { get set }
    func doSomething()
}

struct Section : A {
    var items: [String] = []

    func doSomething() {
        print("doSomething")
        items.forEach { print($0) }
    }
}

class DataSource<T: A> {
    var sections: [T]

    init(sections: [T]) {
        self.sections = sections
    }

    func process() {
        sections.forEach { $0.doSomething() }
    }

    convenience init() {
        var section = Section()
        section.items.append("Goodbye")
        section.items.append("Swift")

        self.init(sections: [section])
    }
}

/*: Client */
var section = Section()
section.items.append("Hello")
section.items.append("Swift") …
Run Code Online (Sandbox Code Playgroud)

generics init swift

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

从故事板启动的初始应用程序无法调用NSDocument init

我已经使用Xcode模板编写了一个带有故事板的macOS文档类型的应用程序,并且在某个地方,初始应用程序启动和文档之间的关联与预期的模式不同,因此我没有期望的NSDocument初始化程序是应用程序首次启动时调用(但此后每个新窗口调用).

我已经将所有四个记录的NSDocument初始化器子类化,如下所示:

public class Simulation: NSDocument {

        override init() {
        debugPrint("--------------------\(#file)->\(#function) called")
        super.init()
    }

    init(contentsOf: URL, ofType: String) throws {
        debugPrint("--------------------\(#file)->\(#function) called")
        fatalError()
    }

    init(for: URL?, withContentsOf: URL, ofType: String) throws {
        debugPrint("--------------------\(#file)->\(#function) called")
        fatalError()
    }
    convenience init(type: String) throws {
        debugPrint("--------------------\(#file)->\(#function) called, type: \(type)")
        self.init()
    }

    public override class func autosavesInPlace() -> Bool {
        debugPrint("--------------------\(#file)->\(#function) called")
        return false
    }
}
Run Code Online (Sandbox Code Playgroud)

应用程序启动时,没有任何内容显示debugPrint输出.应用程序窗口在启动时成功创建,没有明显的文档关联.

但是,我注意到一些我无法解释的奇怪行为:

  1. 虽然我没有看到init调用,但是在应用程序启动文档的某个实例后,会调用autosavesInPlace三次
  2. 当我使用cmd-N(即File-> New,因此newDocument())创建一个新文档时,再调用autosavesInPlace三次,然后执行文档init!
  3. 我从来没有看到makeWindowControllers()的调用

我的NSDocument子类名为Simulation.异常似乎是初始启动中有一些魔法绕过Simulation.init,但之后调用它的每个文档+窗口创建.

这是我的问题:

  1. 为什么初始启动不会调用Simulation.init()?
  2. 当只有那个看似部分构造的初始窗口时,autosavesInPlace如何找到要调用的Simulation实例?

macos init storyboard nsdocument swift

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