在头文件.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。 请问你能说出这个错误的原因吗?
答案 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
您遇到所描述的错误。