2011-05-22 50 views
6

我一直在阅读自动合成的ivars。我的问题是,“是否自动分配?”我希望他们能够成为自我的一部分,以便我可以在调试器中看到他们,但似乎我能看到他们的唯一方法是调用访问器方法(通过gdb'po'命令)。在类/对象的结构中没有空格(就像显式声明的伊娃)?合成的ivars存储在哪里?

(有没有在内存中表示为一个现代化的Objective-C对象的描述?)

为C的人,这让我非常不舒服不能够看到一切。 :-P

回答

1

看起来这会告诉你: How do automatic @synthesized ivars affect the *real* sizeof(MyClass)?

我在心脏一个C的人太多。为什么打扰使用这些自动生成的?我喜欢看一堂课,看看它在数据方面的成效。

有趣的是:他们是如何采取64位的变化,使事情变得更好。 http://www.sealiesoftware.com/blog/archive/2009/01/27/objc_explain_Non-fragile_ivars.html

+0

限制仍然是真的,你不能在模拟器上使用动态ivars?如果这样的话,他们在iPhone上。另外为OS X开发意味着32位二进制文​​件,所以在现实生活中,我无法在其中看到它们。 – 2011-05-22 18:43:41

+0

我相信你现在可以在模拟器中使用它们,但我不确定。 – Wevah 2011-05-22 20:25:29

+0

模拟器的运行时间和设备运行时间相同。 – bbum 2011-05-22 23:27:27

1

它们被添加到目标c对象(其是C结构)没有不同,以有规律的ivar,因此,例如:

@interface TestObject : NSObject { 

} 

@property (nonatomic, assign) int theInt; 

@end 

@implementation QuartzTestView 

@synthesize theInt; 

@end 

可以直接参考theInt的ivar(不通过属性访问器)或者:

- (void)someMethod { 
    theInt = 5; 
} 

OR

- (void)someOtherMethod { 
    self->theInt = 10; 
} 
+0

你说,“没有不同于普通的伊娃”,但是常规的Ivars在调试器中出现,没有明确声明的那些不会显示出来。 – wrlee 2011-06-16 09:03:31

+0

@wrlee,他们确实是这样做的,并且按照你合成它们的顺序。查看[this](https://picasaweb.google.com/lh/photo/xmeQ0hYCt7SAL1DNFXRhfzhx437tMWI6RAv8g-2VuS0?feat=directlink)屏幕截图,并注意'self'在观察窗口中展开。 – 2011-06-27 18:41:03

0

请参阅http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html - 使用现代运行时,实例变量“将为您合成”。尽管可以自己添加一个变量(这样您可以在自我调试时看到它),但是您必须小心,不要直接分配实例变量以保留或复制基于的属性。

+0

这是我的困惑的基础:我在调试器中看不到ivars。我将@ property/@综合指令看作便利标签,并且结果代码应该与我明确指定ivars一样;因为它们没有出现在调试器中,这似乎并不是这种情况。那么,究竟发生了什么,调试器不会将ivars显示为“自我”的一部分? – wrlee 2011-06-16 09:02:20

+1

在观看Apple开发者会议视频之一时,事实证明某些版本的Xcode中存在一个错误,导致它不显示推断的ivars。 – wrlee 2011-12-07 01:48:17