菜鸟教程小白 发表于 2022-12-12 15:25:48

ios - Objective-C 调用特定的类方法


                                            <p><p>我有一个在初始化器中有这个的类:</p>

<pre><code>@implementation BaseFooClass

-(id) init
{
   if (self = )
   {
          // initialize instance variables that always need to start with this value
   }

   return self;
}

-(id) initWithSomeInt:(int) someInt
{
   if (self = ) // &lt;-- I need to make sure that I am calling BaseFooClass&#39;s init here, not SubFooClass&#39;s, does that make sense?
   {
          self.someInt = someInt;
   }

   return self;
}

@end
</code></pre>

<p>这一切都很好,花花公子。我的问题是当我实现子类时:</p>

<pre><code>@implementation SubFooClass

-(id) init
{
   return ;
}

-(id) initWithSomeInt:(int) someInt
{

   if (self = ) // &lt;--- Infinite loop (stack overflow :) )
   {
          // initialize other variables
   }
}

@end
</code></pre>

<p>我基本上需要专门调用<code>BaseFooClass</code>的<code>init</code>而不是<code>SubFooClass</code>的<code>init</code>。 </p>

<p>我无法更改对象的初始化方式,因为我正在将项目从 C# 转换为在我的 iPad 应用程序中使用。</p>

<p>提前谢谢大家</p>

<p>编辑:</p>

<p>由于有人问,这是我的标题:</p>

<pre><code>@interface BaseFooClass : NSObject

// implicit from NSObject
// -(id) init;

-(id) initWithSomeInt:(int) someInt;

// more methods

@end

@interface SubFooClass : BaseFooClass

// implicit from NSObject
// -(id) init;

// implicit from BaseFooClass
//-(id) initWithSomeInt:(int) someInt;


@end
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>Objective-C 不能以这种方式工作,因为运行时将方法转换为函数调用的方式。 Self 始终是已分配类的实例,即使在调用父类(super class)的方法时也是如此。您需要为您的 BaseClassFoo 创建指定的初始化程序并始终去那里。所以你应该做这样的事情:</p>

<pre><code>@implementation BaseFooClass

-(id) init
{
return ; // redirect super class&#39;s designated initializer
}

-(id) initWithSomeInt:(int) someInt
{
if ((self = )) // Designated initializer always calls into super class&#39;s designated initializer (in this case, NSObject&#39;s designated initializer is init
{
    self.someInt = someInt;
}

return self;
}

@end

@implementation SubFooClass

// Here we don&#39;t override init because our super class&#39;s designated initializer
// is initWithSomeInt:
// -(id) init
// {
//   return ;
// }

// we override this because it&#39;s our superclass&#39;s designated initializer, plus it
// is ours as well
-(id) initWithSomeInt:(int) someInt
{
if ((self = ))
{
    // initialize other sub-class specific variables
}
}

@end
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - Objective-C 调用特定的类方法,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/3881477/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/3881477/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - Objective-C 调用特定的类方法