错误: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。 请问你为什么会出现这个错误?
答
首先:您不应该在应用程序中访问任何对象的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
您遇到您描述的错误。
谢谢大家,现在我明白为什么会出现这个错误。 – Cathy 2011-04-26 10:34:37
请注意,retainCount永远不会返回零。 – bbum 2011-04-26 14:24:54
@bbum,我相信在一个无对象上调用它会返回0(请参阅frenetisch applaudierend的答案)。 – Jake 2011-04-27 08:59:59