错误:访问Object的retainCount时出现EXC_Bad_Access

时间:2011-04-26 10:17:22

标签: objective-c memory-management exc-bad-access

在头文件.h

@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

如上面的代码所示,当我在头文件中声明一个对象并尝试访问它的retain count时,给我0.但是如果我在实现文件中声明该对象并访问其retainCount,则会抛出Bad_Access。 请问你能说出这个错误的原因吗?

3 个答案:

答案 0 :(得分:2)

不确定为什么要这么做,但这段代码:

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

只创建指向某种类型对象的指针,它实际上并不创建实例。因此,访问它并询问其retainCount(您首先不应该这样做)将导致有效的崩溃。因为它还不是一个有效的对象。首先尝试初始化它。

更新: 如果你坚持这样做,这里可能有用

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

答案 1 :(得分:2)

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

回答你的问题:

  • object1是一个实例变量,未启动时指向nil。当您向nil发送消息时,它会返回nil(此处为0)。
  • object2是一个尚未设置为任何内容的指针,甚至不是nil,因此它可能指向任何内容。在这里,它指向一个不存在的对象,因此崩溃。

答案 2 :(得分:0)

因为当您在类中将其声明为实例变量时,它会自动使用nil进行初始化。当[nil retainCount]打印为整数(nil)时0再次返回%d

但是在本地声明的变量没有被初始化,并且这样的指针指向某处,最可能是未分配的内存块。并且,由于尝试访问未分配的内存位置会导致EXC_BAD_ACCESS您遇到所描述的错误。