2011-04-26 78 views
0

在頭文件中.H錯誤:EXC_BAD_ACCESS在訪問對象的retainCount

@interface MemoryAppDelegate:NSObject <UIApplicationDelegate> { 
Class1 *class1_obj; 
} 

在執行文件的.m

@implementation Memory : (UIApplication*) application 
{ 
NSLog(@"Retain Count of class1_obj %d",[class1_obj retainCount]); //ouput retainCount is 0 
Class2 *class2_obj; 
NSLog(@"Retain Count of class2_obj %d",[class2_obj retainCount]); // gives EXC_Bad_Access error 

如在上述代碼中,當我在報頭聲明一個對象文件,並嘗試訪問其保留計數是給我0.但如果我聲明對象在實現文件並訪問其retainCount它引發Bad_Access。 請問你爲什麼會出現這個錯誤?

+0

謝謝大家,現在我明白爲什麼會出現這個錯誤。 – Cathy 2011-04-26 10:34:37

+0

請注意,retainCount永遠不會返回零。 – bbum 2011-04-26 14:24:54

+0

@bbum,我相信在一個無對象上調用它會返回0(請參閱frenetisch applaudierend的答案)。 – Jake 2011-04-27 08:59:59

回答

2

首先:您不應該在應用程序中訪問任何對象的retaincount

要回答你的問題:

  • object1是一個實例變量,它指向nil沒有啓動的時候。當您發送消息到nil時,它會返回nil(這裏是0)。
  • object2是一個指針,沒有設置任何東西,甚至沒有nil,所以它可能指向任何東西。在這裏,它指向一個不存在的對象,所以它崩潰了。
2

不知道爲什麼你做了這一切,但是這個代碼:

Class2 *class2_obj; 
NSLog(@"Retain Count of class2_obj %d",[class2_obj retainCount]); // gives EXC_Bad_Access error 

只創建一個指向特定類型的對象,它實際上並沒有創建一個實例。因此訪問它並詢問它的retainCount(你不應該在第一個地方做),將導致有效的崩潰。因爲它不是一個有效的對象(還)。嘗試先初始化它。

UPDATE: 如果你堅持這樣做,這裏是一些可能的工作

Class2 *class2_obj = [[Class2 alloc] init]; 
NSLog(@"Retain Count of class2_obj %d",[class2_obj retainCount]); // gives retain count of 1 
[class2_obj release]; 
0

因爲當你在課堂上作爲一個實例變量聲明它,它會自動與nil初始化。並再次nil[nil retainCount]回報是0當打印爲整數(%d

但是,其局部聲明的變量沒有初始化,這樣的指針指向剛剛地方,最有可能沒有分配的內存塊。並且由於試圖訪問未分配的內存位置會導致EXC_BAD_ACCESS您遇到您描述的錯誤。