菜鸟教程小白 发表于 2022-12-13 10:09:01

ios - 在objective-c中的[super init]之前做一些事情


                                            <p><p>我想在调用 之前在派生对象中设置一个成员变量。
我所能找到的只是你不应该做这样的事情。无论如何,我的工作是有效的,但实际上我想知道违反规则的后果是什么。如果有正确的方法来解决这个问题,甚至更好。</p>

<p>细节:</p>

<p>我有几个包装器将 c++ 对象绑定(bind)到一个 Objective-c 对象(主要是 UI...View 或 UI...Controller)</p>

<pre><code>@interface my_scrollview : UIScrollView
{
my_c_class* m_p;
}
-(id) initWithFrame:(CGRect)frame wrapper: (my_scrollview*) pWrap;
-(void) setContentOffset:(CGPoint)contentOffset;
@end
@implementation dwin_scrollview_ios
-(id) initWithFrame:(CGRect)frame wrapper: (my_scrollview*) pWrap
{
m_p = pWrap;    // illegal but works?
return ;
//m_p = pWrap;// to late because already called overriden func.
}
</code></pre>

<p>在我覆盖的 setContentOffset 方法中,我需要访问我的 C++ 对象。
出现问题是因为 initWithFrame 在内部使用 setContentOffset 初始化其内容。因此,在我可以“合法地”设置指向我的 c++ 对象的链接之前调用此方法。 </p>

<p>我可以通过检查是否设置了 m_p 来实现我的覆盖(幸运的是它被初始化为 nil)。但是我必须在 init 方法之后同步 View 的状态和我的 c++ 对象。在这个例子中,这没什么大不了的,但是其他类似的事情要复杂得多,我最终得到了很多重复初始化步骤的代码,或者让我重新同步,尽管在 我知道之前我是同步的。</p>

<p>有没有一种模式可以解决这个正确(优雅)的问题?</p>

<p>在调用 ; 之前 int 指针真的那么糟糕吗?</p>

<p>(我假设一个后果是如果 返回 nil 会崩溃...?还有其他情况吗?)</p>

<p>提前致谢
莫里茨</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>Objective-C 中的 init 方法并没有什么神奇之处。 alloc 返回您想要的类的对象,所有实例变量都初始化为 0/nil/NULL/0.0 等。然后每个 init 方法只执行开发人员编写的代码。 </p>

<p>有些事情显然很愚蠢,比如设置父类(super class)的实例变量,然后调用 会立即覆盖它。而且您需要注意,init 不一定返回 self,而是返回一个不同的对象,在这种情况下,您在调用 之前在基类中初始化的所有内容都将消失。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在objective-c中的之前做一些事情,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/32271212/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/32271212/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在objective-c中的[super init]之前做一些事情