注意:我对Objective-C比较新,我来自Java和PHP.
有人可以向我解释为什么我总是要先分配然后初始化一个实例?
不能在这样的init方法中完成:
+ (MyClass*)init {
MyClass *instance = [MyClass alloc];
[instance setFoo:@"bla"];
return instance;
}
+ (MyClass*)initWithString:(NSString*)text {
MyClass *instance = [MyClass init];
[instance setFoo:text];
return instance;
}
...
Run Code Online (Sandbox Code Playgroud)
这只是旧C日的残骸还是有些东西我没有看到?
我知道这不是问题,因为我总是可以调用alloc和init,但由于它有点乏味,我想至少知道我为什么要这样做.
到目前为止,我喜欢语言的表达能力,但这是我想要完全理解的,以便考虑Objective-C的方式.
谢谢!
我需要将NSDate设置为iPhone App的特定日期,时间和时区.
下面的示例代码在iOS 4上运行正常,因为在iOS 4中引入了setTimeZone.如何在不使用setTimeZone的情况下轻松地将NSDate设置为日期,时间和时区,以便可以在iOS 3.0设备上使用?
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setYear:2010];
[comps setMonth:8];
[comps setDay:24];
[comps setHour:17];
[comps setMinute:5];
[comps setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"] ];
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *referenceTime = [cal dateFromComponents:comps];
Run Code Online (Sandbox Code Playgroud)
猜猜这应该很简单,但不知何故NSDate,组件和日历和我不是好朋友......
可能重复:
Super可以处理多重继承吗?
Python继承?我有一个类结构(下面),并希望子类调用__init__父双方.这可能是以"超级"方式做的还是只是一个可怕的想法?
class Parent1(object):
def __init__(self):
self.var1 = 1
class Parent2(object):
def _init__(self):
self.var2 = 2
class Child(Parent1, Parent2):
def __init__(self):
## call __init__ of Parent1
## call __init__ of Parent2
## super(Child, self).__init__()
Run Code Online (Sandbox Code Playgroud) 我得到了这个例外,但解决了它.
java.lang.NoSuchMethodError: antlr.NoViableAltForCharException.<init>
(CLjava/lang/String;II)V
Run Code Online (Sandbox Code Playgroud)
但是我想知道如何解释这些消息:"(CLjava/lang/String; II)V"另外,这个"init"是否提到了NoViableAltForCharException类的构造函数?
谢谢.
当我打开emacs时,*Messages*缓冲区中会出现以下消息,并且我的init.el文件(位于~/.emacs.d/init.el)不会加载.
Loading 00debian-vars...done
Loading /etc/emacs/site-start.d/50cedet-common.el (source)...
Error while loading 50cedet-common: Cannot open load file: cedet-autogen
Loading /etc/emacs/site-start.d/50dictionaries-common.el (source)...
Loading debian-ispell...
Loading /var/cache/dictionaries-common/emacsen-ispell-default.el (source)...done
Loading debian-ispell...done
Loading /var/cache/dictionaries-common/emacsen-ispell-dicts.el (source)...done
Loading /etc/emacs/site-start.d/50dictionaries-common.el (source)...done
Loading /etc/emacs/site-start.d/50haskell-mode.el (source)...
Loading /usr/share/emacs/site-lisp/haskell-mode/haskell-site-file.el (source)...done
Loading /etc/emacs/site-start.d/50haskell-mode.el (source)...done
Loading /etc/emacs/site-start.d/50php-elisp.el (source)...done
Loading /etc/emacs/site-start.d/51speedbar.el (source)...done
For information about GNU Emacs and the GNU system, type C-h C-a.
Run Code Online (Sandbox Code Playgroud)
当我谷歌搜索或查看emacs wiki时,我找不到有关cedet的任何有用信息.奇怪的是,当我使用M-x eval-buffer或M-x load-file,一切正常.HOME应该是什么,我正在运行版本23.3.1.
在发生这种情况之前,我一直试图让jshint使用emacs,尽管我不确定这是否与所有相关的https://github.com/daleharvey/jshint-mode有关.
我正在为RHEL上的Jetty创建一个init脚本.试图使用daemoninit library(/etc/rc.d/init.d/functions)提供的功能.
我找到了这个简洁的文档和一个在线示例(我也一直在查看系统上的其他init脚本).
从在线查看此片段以启动守护程序
daemon --user="$DAEMON_USER" --pidfile="$PIDFILE" "$DAEMON $DAEMON_ARGS &"
RETVAL=$?
pid=`ps -A | grep $NAME | cut -d" " -f2`
pid=`echo $pid | cut -d" " -f2`
if [ -n "$pid" ]; then
echo $pid > "$PIDFILE"
fi
Run Code Online (Sandbox Code Playgroud)
为什么要费心查找$PID并手写$PIDFILE?我想我想知道--pidfile该daemon功能选项的重点是什么.
我试图使用配置文件和自己的处理程序python日志记录.这在某种程度上起作用.让我感到困惑的是__init__两次__del__被召唤并被召唤一次.当我删除整个配置文件的东西并直接在代码中创建处理程序__init__被调用一次并且__del__永远不会被调用.
我的问题:
__init__叫两次?__del__召唤的频率低于__init__?代码:
#!/bin/env python
import logging
import logging.handlers
import logging.config
class Test1TimedRotatingFileHandler(logging.handlers.TimedRotatingFileHandler):
def __init__(self,filename):
print "init called"
logging.handlers.TimedRotatingFileHandler.__init__(self,filename, when='S', interval=86400, backupCount=8, encoding=None)
def __del__(self):
print "del called"
if hasattr(logging.handlers.TimedRotatingFileHandler,"__del__"):
logging.handlers.TimedRotatingFileHandler.__del__(self)
logging.config.fileConfig('/root/test1.conf')
logger = logging.getLogger("test1")
Run Code Online (Sandbox Code Playgroud)
配置文件:
[formatters]
keys: simple
[handlers]
keys: file
[loggers]
keys: root
[formatter_simple]
format: "%(message)s"
[handler_file]
class: test1.Test1TimedRotatingFileHandler
args: ("/root/test1.log",)
level=INFO
[logger_root]
level: INFO
handlers: file
qualname: test1
Run Code Online (Sandbox Code Playgroud)
输出如下:
init called …Run Code Online (Sandbox Code Playgroud) 编辑:这是Xcode 6.4的完整代码示例
我有简单的iOS应用程序没有故事板.我设置rootViewController为UIWindow在AppDelegate.swift这样的:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let tabBarController = TabBarController()
window = UIWindow(frame: UIScreen.mainScreen().bounds)
window?.rootViewController = tabBarController
window?.makeKeyAndVisible()
return true
}
Run Code Online (Sandbox Code Playgroud)
TabBarController 类的实现如下:
class TabBarController: UITabBarController {
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
// Next line is called after 'viewDidLoad' method
println("init(nibName: bundle:)")
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad() …Run Code Online (Sandbox Code Playgroud) 我很好奇,无论如何,在init方法中调用一个方法来设置类的实例属性.基本上我只有一个子类UIView的类,在init中添加一些子视图,其中一些子视图是类的实例变量.
class MyView: UIView {
var collectionView: UICollectionView
convenience init () {
self.init(frame:CGRectZero)
}
override init (frame : CGRect) {
super.init(frame : frame)
addSubviews()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
addSubviews()
}
func addSubviews (){
self.collectionView = UICollectionView()
}
}
Run Code Online (Sandbox Code Playgroud)
现在问题是我在初始化类内部属性之前不能调用super init(属性'self.collectionView'在super.init调用时没有被初始化),但是我也无法调用我的自定义方法来初始化那些变量super.init,因为它不能在初始化之前使用self.我意识到我可以使实例变量可选,但它似乎不太优雅,因为我知道它将始终被初始化(还有更多,这只是一个简化版本).有没有办法在不制作所有实例变量选项的情况下完成此操作?
编辑:
我想最终我的问题是为什么swift dis-allow在调用super.init之前调用一个方法?有什么区别:
override init (frame : CGRect) {
addSubviews()
super.init(frame : frame)
}
final func addSubviews (){
self.collectionView = UICollectionView()
}
Run Code Online (Sandbox Code Playgroud)
和
override init (frame : CGRect) {
self.collectionView = UICollectionView()
super.init(frame : frame)
}
Run Code Online (Sandbox Code Playgroud) 这被认为是典型的
- (id)init {
self = [super init];
if (self) {
// <#initializations#>
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
但是,与这样的事情做出适当的反应并不是更好吗?
- (id)init {
self = [super init];
if (self) {
// <#initializations#>
} else {
@throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"you think your constructor is executing, but it's not"] userInfo:nil]
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
这个问题的必然结果是,"在什么条件下会[super init]返回nil,你不应该在init方法中处理它? "