在.m文件中,@interface和@implementation花括号之间的区别是什么?

4

我是一名Objective-C的初学者,之前使用的是Swift。现在看来好像有两种不同的@interface实例可以用来声明我的实例变量。一个在我的头文件中,例如下面这样:

// Header file
@interface ViewController : UIViewController
{
   // declare instance variables
}

@end

另外,我可以在我的实现文件中添加一个类似于这样的内容:
// Implementation file
@interface ViewController ()
// declare instance variables
@end

@implementation ViewController

@end

编辑:我曾经学习过“旧的方法”,这让我在.h文件中声明私有变量。我的困惑来自于看到旧方法(在.h文件中)和新方法(在.m文件中)都声明了私有变量。目前为止,我已经学到了以下内容:

// .h
    @interface SomeClass : UIViewController

    @property (nonatomic, assign) BOOL someBool;
       // declare other properties, which will all be public
    @end

// .m
    @interface SomeClass () <UITextFieldDelegate>
       // what do I declare here?...
    @end

    @implementation SomeClass {
      // ...and what do I declare here?
    }

    // method implementations

    @end

然而,我仍然不清楚我的.m文件中的@interface和@implementation花括号之间的区别。 @matt说永远不要使用花括号,但是@rmaddy在这里的答案表明@implementation SomeClass {}是可以的。那么,究竟哪个是正确的呢?


2
马特没有说过永远不要使用花括号。他建议永远使用属性而不是实例变量。除此之外,如果您选择使用实例变量(许多人都这样做),那么它们应该放在.m文件中的@implementation{ }中,就像您更新问题中链接的重复问题的已接受答案和我的答案所讨论的那样。 - rmaddy
2
@interface()(也称为类扩展)在.m文件中应该用于私有属性和私有协议。@implementation{}块应该用于私有实例变量。 - rmaddy
1
一个实例变量就是这样,它是在类的实例化过程中创建的变量。而属性则是一个获取器方法和(可选的)带有定义语义(原子性/非原子性、内存管理等)的设置器方法。通常情况下,一个属性会由一个合成的实例变量支持,但这并不是必要的。无论哪种情况,私有或公有都是完全独立的方面,只是简单地定义了谁可以看到实例变量或属性。 - rmaddy
1
@asma22 不,ivars 没有任何 setter 或 getter。它只是一个变量。这个变量像其他变量一样被访问。没有涉及到方法调用。属性只是一对方法。这些方法的实现定义了原子性等特性。这些方法甚至不需要 ivar(尽管通常会使用一个)。 - rmaddy
1
@asma22 这只是一个关于内存的作业,就这样。请不要再发帖了。如果需要,请发布您自己的问题。我们不应该偏离这个原始问题。 - rmaddy
显示剩余5条评论
1个回答

3

您希望它可以被公开访问吗?那么请在.h文件中编写。

如果您不希望其他类看到它,也就是说,您想将其设置为私有并仅对该类本身可见,则请在.m文件中编写。

更多信息,请参阅以下问题: 在“现代”Objective-C中放置iVars的位置?


但是对于我的.h文件,我应该在大括号里声明什么?看起来大括号承诺了一些封装的意义,而在大括号外面则是公共的。我感觉我见过两种方式声明实例变量。 - slider
1
实例变量(ivars)永远不应该是公共的。 - rmaddy
@dperk 请看这个链接 https://dev59.com/JnI95IYBdhLWcg3wtwf4。但是正如rmaddy所提到的,你不应该使用公共实例变量,这基本上是不好的做法。此外,我在答案中分享的链接也提供了你问题的答案。还可以参考这些链接:https://dev59.com/MWAg5IYBdhLWcg3wYqJ0 和 https://dev59.com/B2sz5IYBdhLWcg3w0bSl。希望它们都能帮助你更好地理解。 - mfaani
感谢 @rmaddy,请查看已编辑的内容。 - slider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接