代码之家  ›  专栏  ›  技术社区  ›  jhabbott

automatic@synthed ivars如何影响*real*sizeof(myclass)?

  •  7
  • jhabbott  · 技术社区  · 15 年前

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

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

    但是我没有为它们声明任何ivar,我可以在.m文件中@synthesis它们,如下所示:

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

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

    - (NSInteger)test1
    {
        return 0;
    }
    - (NSInteger)test2
    {
        return 0;
    }
    - (NSInteger)test3
    {
        return 0;
    }
    - (NSInteger)test4
    {
        return 0;
    }
    

    然后我的课又回到原来的大小。这是根据myclass.m文件中的sizeof确定的,因此编译器在这个阶段知道变量是被合成的还是被实现的。

    然而,其他类不知道这只是从头文件,size of(myclass)显示没有附加(自动)ivar的大小,不管它们是否被合成。这对我来说似乎完全是一团糟,sizeof可以返回一个不同的值。在子类化和使用解引用+偏移量时,编译器的行为如何正确?( -> )子类的公共ivar上的运算符,如果它不能确定类的大小?

    2 回复  |  直到 15 年前
        1
  •  4
  •   Yuji    15 年前

    阅读这篇优秀的文章 non-fragile ivars 总是乐于助人的仓鼠。同时阅读 this post 带着爱。

    使用 sizeof 对于obj-c对象来说,运算符是相当无用的。我相信,运行时不会用它来操纵事物。

        2
  •  2
  •   Gobra    15 年前

    OBJ-C操作指针。很多工作都是在运行时完成的,而不是在编译时完成的,实际上您不能将obj-c类用作值,而只能用作指针。例如,可以使用ValueForkey:获取任何值,并使用PerformSelector:调用任何方法。实际上,您甚至可以在运行时使用中的方法更改方法实现(如类\u replaceMethod)。

    底线:Obj-C与你在C和C++中看到的相差甚远。很多东西如果在运行时执行,会给一些灵活性和一些痛苦。只是不同而已。你应该阅读苹果公司关于obj-c的文档,或者读一本关于该语言的书(例如,斯蒂芬G.科汉的《在objective-c中编程》)。