【问题标题】:Is there a init method in iOS that is always called?iOS中是否有一个总是被调用的init方法?
【发布时间】:2012-08-01 01:19:38
【问题描述】:

有没有在 Cocoa 中总是被调用的方法?许多类都有initinitWith,但更糟糕的是,它们可以从笔尖或其他东西加载。在这种情况下,我不想四处寻找它是如何做到的。我只是想设置一些初始变量和其他东西,并且我想要一个子类化方法,无论它是UIViewUIViewController 还是UITableViewCell 等,我都可以依赖它。

【问题讨论】:

    标签: ios objective-c cocoa-touch init


    【解决方案1】:

    不,没有这样的方法。 init 来自NSObject,因此每个对象都可以使用它,并且子类也定义了自己的初始化方法。例如,UIView 定义了initWithFrame:,此外还有来自协议的init 方法,例如定义initWithCoder:NSCoding。这就是 Objective-C 的动态特性,任何东西都可以随时扩展。话虽如此,有一些模式。 UIViewController 几乎总是采用 initWithNibName:bundle:UIView 几乎总是采用 initWithFrame:initWithCoder:。我所做的是创建一个内部初始化方法,然后让其他初始化方法调用它。

    - (void)initialize
    {
        //Do stuff
    }
    
    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if(self)
        {
            [self initialize];
        }
    }
    
    - (id)initWithCoder:(NSCoder *)aCoder
    {
        self = [super initWithCoder:aCoder];
        if(self)
        {
            [self initialize];
        }
    }
    

    【讨论】:

    • 我喜欢那个解决方案,所以它至少从特定的 init 方法中删除了它。我希望有一个通用的 init,所有的 init 都可以使用。没有这样的运气!谢谢。 cocos2d 要容易得多,因为所有的 init 方法最终总是调用 init,所以你总是可以确定你会得到它。这是你真正欣赏的东西。否则你会犯错误,分配变量或执行永远不会发生的调用,然后尝试调试......无论如何,我会停下来,所以我不会开始哭泣。
    • @borrrden 抱歉,不是每个类都调用一次 initialize 吗?
    • @entropy 是的,有一个名为 initialize 的方法,每次运行每个类都会调用一次,但它是一个类方法(与实例方法相反),因此不会导致任何问题。不过,实际上您可以随意命名它。我发现在末尾添加类名可以防止子类意外覆盖它。
    【解决方案2】:

    不是 100% 肯定它总是被调用,但我很确定这是一个可行的选择。老实说,我不记得我曾在实践中看到过这种方法,而且我通常会回避使用这种方法(我完全不知道为什么,可能是因为它不是最干净和最全面的实现方法这...):

    -didMoveToSuperview()
    

    来自文档:

    告诉视图它的超级视图改变了。 此方法的默认实现什么也不做。每当父视图更改时,子类可以覆盖它以执行其他操作。

    【讨论】:

      【解决方案3】:

      您可以通过多种方式编写自定义初始化程序。

      - (id)initWithString:(NSString *)string {
          if((self == [super init])) {
              self.string = string;
          }
          return self;
      }
      

      这就是我编写初始化程序的一般方式。例如,上面的那个需要一个字符串。 (如果您不想传递字符串,则不必传递)。

      顺便说一句,init 是一种方法。根据 NSObject 的头部,init 有一个方法实现。

      【讨论】:

      • -1 这似乎并没有试图回答这个问题。 @napierzaza 没有询问如何编写自定义初始化程序,他们正在寻找一种初始化方法,该方法最终由每个对象调用,无论类如何,以便在初始化时覆盖它并提供默认实例变量等。
      • 我认为这根本不是初始化程序。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多