菜鸟教程小白 发表于 2022-12-13 02:32:22

ios - 在我的简单案例中,#import 和 @class 之间的区别


                                            <p><p>在我的 Controller 的头文件中,我需要声明另一个 Controller 的实例。我是通过以下方式做到的:</p>

<pre><code>#import &#34;BIDMyRootController.h&#34;
#import &#34;BIDAnotherController.h&#34; //I import another controller&#39;s header

@interface BIDCurrentController : BIDMyRootController

//I declare an instance of another controller
@property (strong, nonatomic) BIDAnotherController *anotherController;

@end
</code></pre>

<p>上面的代码非常简单。没问题! </p>

<p>但我也注意到,或者,我可以使用 <code>@class</code> 以下列方式替换 <code>BIDAnotherController</code> 的 <code>#import</code> 语句: </p>

<pre><code>#import &#34;BIDMyRootController.h&#34;
@class BIDAnotherController //I declare another controller with @class tag

@interface BIDCurrentController : BIDMyRootController

//I declare an instance of another controller
@property (strong, nonatomic) BIDAnotherController *anotherController;

@end
</code></pre>

<p>也没问题! </p>

<p>但是我现在很困惑,<code>#import "BIDAnotherController.h"</code> 和 <code>@class BIDAnotherController</code> 有什么区别,那么如果它们都ok???</code> p>

<hr/>

<p><strong>更新:</strong></p>

<p>对了,在<code>BIDCurrentController</code>的实现文件中,我又导入了<code>BIDAnotherController</code>:</p>

<pre><code>#import &#34;BIDCurrentController.h&#34;
#import &#34;BIDAnotherController.h&#34; //import another controller again
@implementation BIDCurrentController
...
@end
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><ul>
<li><p>使用 <code>@class BIDAnotherController</code> 被称为 <code>BIDAnotherController</code> 的前向声明,它基本上告诉编译器它的实现将在未来的某个时候存在. </p></li>
<li><p><code>#import "BIDAnotherController.h"</code> 实际上是将<code>BIDAnotherController.h</code> 的内容包含到当前文件中。</p></li>
</ul>

<p>如果您只需要使用 <code>BIDAnotherController</code> 作为方法的属性或参数,则可以避免使用前向声明,因为您的代码不需要知道它存在的任何信息.如果您需要使用 <code>BIDAnotherController</code> 的属性或方法,则需要导入其 header (否则编译器甚至不会知道这些属性或方法存在!)。</p>

<p>通常使用前向声明来中断两个或多个头文件之间的包含循环。防止循环的最简单方法是首选 <code>@class</code> 声明,除非您确实需要访问类的属性或方法。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在我的简单案例中,#import 和 @class 之间的区别,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/16320407/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/16320407/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在我的简单案例中,#import 和 @class 之间的区别