自动@synthesized ivars如何影响* real * sizeof(MyClass)?

时间:2010-11-02 10:36:12

标签: objective-c

如果我包含一些像这样的自动属性:

@property (nonatomic, readonly) NSInteger           test1;
@property (nonatomic, readonly) NSInteger           test2;
@property (nonatomic, readonly) NSInteger           test3;
@property (nonatomic, readonly) NSInteger           test4;

但是我没有为他们声明任何iVars,我可以像这样在.m文件中对它们进行@synthesize:

@synthesize test1;
@synthesize test2;
@synthesize test3;
@synthesize test4;

这没有问题,编译器会自动添加iVars - sizeof(MyClass)显示我的类(正如您所料)比未声明和合成这些属性大16个字节。但是,如果我没有合成它们,我会像这样实现它们:

- (NSInteger)test1
{
    return 0;
}
- (NSInteger)test2
{
    return 0;
}
- (NSInteger)test3
{
    return 0;
}
- (NSInteger)test4
{
    return 0;
}
然后我的班级回到原来的大小。这是根据MyClass的.m文件中的sizeof确定的 - 因此编译器在此阶段知道变量是否已合成或实现。

但是,其他类只是从头文件中不知道这一点,sizeof(MyClass)显示的大小没有附加(自动)iVars,无论它们是否合成。这似乎完全搞砸了我,sizeof可以返回不同的值。如果不能确定类的大小,子类的公共iVars上使用dereference + offset(->)运算符时,编译器如何正确运行?

2 个答案:

答案 0 :(得分:4)

通过始终有用的仓鼠阅读这篇优秀的帖子non-fragile ivars。也请用爱情阅读this post

使用sizeof运算符对Obj-C对象来说是无用的。我相信运行时不会用它来操纵事物。

答案 1 :(得分:2)

Obj-C操作指针。很多东西都是在运行时完成的,而不是编译时间,实际上你不能将Obj-C类用作值,只能用作指针。例如,您可以使用valueForKey获取任何值:并使用performSelector:调用任何方法。实际上,您甚至可以使用方法(如class_replaceMethod)在运行时更改方法实现。

结论:Obj-C与您在C和C ++中看到的相去甚远。很多东西如果在运行时执行会带来一些灵活性以及一些痛苦......它只是不同。您应该阅读有关Obj-C的Apple文档或者可能是关于该语言的书籍(例如,Stephen G. Kochan编写的Objective-C编程)