标签: init

为什么在Objective-C中单独调用alloc和init?

注意:我对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的方式.

谢谢!

oop cocoa objective-c init alloc

15
推荐指数
5
解决办法
6402
查看次数

将NSDate设置为特定日期,时间和时区

我需要将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,组件和日历和我不是好朋友......

iphone xcode init nsdate

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

使用super调用多个父类的init?

可能重复:
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)

python init multiple-inheritance super new-style-class

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

理解NoSuchMethod异常中的方法签名

我得到了这个例外,但解决了它.

java.lang.NoSuchMethodError: antlr.NoViableAltForCharException.<init>
(CLjava/lang/String;II)V
Run Code Online (Sandbox Code Playgroud)

但是我想知道如何解释这些消息:"(CLjava/lang/String; II)V"另外,这个"init"是否提到了NoViableAltForCharException类的构造函数?

谢谢.

java constructor exception init nosuchmethoderror

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

Emacs init.el文件无法加载

当我打开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-bufferM-x load-file,一切正常.HOME应该是什么,我正在运行版本23.3.1.

在发生这种情况之前,我一直试图让jshint使用emacs,尽管我不确定这是否与所有相关的https://github.com/daleharvey/jshint-mode有关.

emacs init

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

RedHat守护进程功能用法

我正在为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?我想我想知道--pidfiledaemon功能选项的重点是什么.

linux bash redhat daemon init

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

Python日志记录:为什么__init__被调用两次?

我试图使用配置文件和自己的处理程序python日志记录.这在某种程度上起作用.让我感到困惑的是__init__两次__del__被召唤并被召唤一次.当我删除整个配置文件的东西并直接在代码中创建处理程序__init__被调用一次并且__del__永远不会被调用.

我的问题:

  1. 为什么__init__叫两次?
  2. 为什么被__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)

python logging config init handler

13
推荐指数
2
解决办法
5080
查看次数

在执行整个init方法之前调用viewDidLoad

编辑:这是Xcode 6.4的完整代码示例

我有简单的iOS应用程序没有故事板.我设置rootViewControllerUIWindowAppDelegate.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 uitabbarcontroller viewdidload ios swift

13
推荐指数
2
解决办法
4845
查看次数

'在super.init初始化self'之前在方法调用中使用self,不能通过方法调用初始化属性

我很好奇,无论如何,在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)

init instance-variables swift

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

如果[super init]返回nil,为什么不抛出异常?

这被认为是典型的

- (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方法中处理它? "

cocoa-touch exception objective-c init

12
推荐指数
3
解决办法
2930
查看次数