我想创建一个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)
所以我的问题是:有更好的方法来处理这个问题吗?我确定我错过了一些非常明显的东西,但我没有看到它.
编辑:我想这样做的原因,我可以在下面的评论中看到:
我想创建一个始终以特定视图控制器开始的导航控制器.我想把这个隐藏在班级的消费者手中.无需暴露不需要暴露的东西.让生活变得更轻松,编码更清晰(封装发明的原因之一,对吧?)
出于某种原因,我无法左右让我的头__init__和__new__.我有一堆从终端运行良好的代码,但当我将其作为Google快速搜索框的插件加载时,我收到错误TypeError: default __new__ takes no parameters.
我一直在读这个错误,这让我的脑子旋转起来.目前我有3个类,没有子类,每个类都有自己def的类.我从不使用def __init__或def __new__,但我已经明确感觉这些是给我错误的功能(或缺少它).
我不知道如何将代码汇总到一个在这里有用的代码片段,因为我有点过头,但整个脚本都可以在github上找到.不要指望任何人为我修改我的代码,我只是在我的智慧结束.一个简单的(简单的英语,而不是python文档的引用,我已经阅读了20次,但仍然没有真正理解)探索为什么会出现这个错误,或者为什么我应该,或者不是,使用__init__和/或__new__功能将得到认真的赞赏.
使用内置或可从内核访问的python解释器来构建Linux内核是否可能并且并不难以置信,它可以运行python文件作为init进程?
我们的服务器上有git 1.5.4.3(2008年2月的版本).看来,当时没有选择--bare.
那我怎么能创建一个裸存储库呢?
在本地创建它并将其scp到服务器将是一种选择,但需要付出太多努力.或者是否可以使用本地 git命令创建新的远程存储库?
可能重复:
Python init和self他们做了什么?
任何人都可以解释一下__init__(self)吗?我一直在读其他问题和人们提到超级课程?什么是超级课程?我认为程序应该从一开始
def print_word(word):
print word
Run Code Online (Sandbox Code Playgroud)
是__init__(self)某种特殊情况,因为它有下划线和"自我"吗?抱歉没有具体的术语......还在学习.
它说,在嵌入式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) 在systemd环境中,当我执行ps -auxf时,我看到kthread的PID为2,而systemd分配了PID 1.
那么,谁将PID 2分配给kthread,为什么当kthread被称为systemd时它会获得PID 2 ?
我是一个初学者,我想了解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意味着什么?
我在创建方便的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) 我已经使用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输出.应用程序窗口在启动时成功创建,没有明显的文档关联.
但是,我注意到一些我无法解释的奇怪行为:
我的NSDocument子类名为Simulation.异常似乎是初始启动中有一些魔法绕过Simulation.init,但之后调用它的每个文档+窗口创建.
这是我的问题: