错误:EXC_BAD_ACCESS在访问对象的retainCount

问题描述:

在头文件中.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

首先:您不应该在应用程序中访问任何对象的retaincount

要回答你的问题:

  • object1是一个实例变量,它指向nil没有启动的时候。当您发送消息到nil时,它会返回nil(这里是0)。
  • object2是一个指针,没有设置任何东西,甚至没有nil,所以它可能指向任何东西。在这里,它指向一个不存在的对象,所以它崩溃了。

不知道为什么你做了这一切,但是这个代码:

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]; 

因为当你在课堂上作为一个实例变量声明它,它会自动与nil初始化。并再次nil[nil retainCount]回报是0当打印为整数(%d

但是,其局部声明的变量没有初始化,这样的指针指向刚刚地方,最有可能没有分配的内存块。并且由于试图访问未分配的内存位置会导致EXC_BAD_ACCESS您遇到您描述的错误。