在Objective-C中,@interface部分列出了实例变量。。。isn';这不是有点放错地方了吗?

在Objective-C中,@interface部分列出了实例变量。。。isn';这不是有点放错地方了吗?,objective-c,interface,Objective C,Interface,据推测,接口将讨论抽象——类的接口——什么方法可用,它们采用什么参数,返回值是什么——因此定义实例变量 在@interface部分中可能会有点混乱 这些实例变量可以是任何东西,它们是内部实现细节——程序员可以使用10个实例定义class a 变量,而另一个程序员可以重写整个类,使用相同的接口(API),并且只使用6个实例变量,因此实例变量与@interface部分实际上是无关的,不是吗 如果实例变量列在一个单独的部分(例如@states部分)中,以指示它们是对象的内部状态,是否更有意义?您也可以

据推测,接口将讨论抽象——类的接口——什么方法可用,它们采用什么参数,返回值是什么——因此定义实例变量 在@interface部分中可能会有点混乱

这些实例变量可以是任何东西,它们是内部实现细节——程序员可以使用10个实例定义
class a
变量,而另一个程序员可以重写整个类,使用相同的接口(API),并且只使用6个实例变量,因此实例变量与
@interface
部分实际上是无关的,不是吗


如果实例变量列在一个单独的部分(例如
@states
部分)中,以指示它们是对象的内部状态,是否更有意义?

您也可以在实现文件中定义实例变量,请尝试一下


此外,如果您不想显示实际的实例变量,而只想显示属性访问器,您可以在接口和实现中定义@property(而不是实例字段),使用
@synthesis myProperty=\u myField。原来,Objective-C类只不过是结构中的结构而已。也就是说,假设您有一个子类NSObject和该子类的一个子类。编译器将有效地连接IVAR,以创建一个可以封装整个实例的IVAR的结构

因此,必须公开IVAR,以便编译器能够为子类中的各种IVAR计算正确的偏移量,正如您所观察到的,应该是实现细节的内容成为类的公共API的一部分

也就是说,这是“脆弱的基类”问题。如果不重新编译所有子类(已知和未知),就无法更改超类中的IVAR,否则将面临崩溃的风险

这在Objective-C2.0附带的“现代ABI”中都得到了修复,或多或少(由于二进制兼容性的依赖性,它并不适用于所有平台)

通过修复“脆弱的基类”问题,它还使编译器能够在@interface之外(包括在@implementation中)接受ivar声明,作为类扩展的一部分或
@synthesis
隐含的声明


最终的结果是,您的IVAR可以完全私有,您可以随心所欲地更改它们,而无需重新编译子类。

您会将
@状态
声明放在哪里?如果有几个实现文件,如果没有保存在公共标题中,您将如何管理它们之间的状态?等待那些破坏NDA的人在10..9..8..D中发布这些文件,这是NDA'ed吗?这是一个普通的客观C问题。-1不是因为这不是一个有效的观察结果,而是因为它不是一个有明确答案的问题。对于聊天来说,可能比问答形式更好。Objective-C的命名法可能有点混乱。你认为是一个“类”,它称之为“接口”。你认为是一个“接口”,它称之为“协议”。这正是新模板在xcode中开始做的。简要说明:不建议使用以u开头的变量名,因为它们可以将一些内部变量添加到框架中。为了避免这种情况,您可以使用“myVariable”而不是“myVariable”。
{{{
  // @interface NSObject
  Class isa;
  }
 // @interface Subclass : NSObject
 int ivar1;
 int ivar2;
 }
// SubSubclass : Subclass
int ivar3;
}