2011-05-22 52 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