在头文件.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与上面的代码一样,当我在头文件中声明一个对象并试图访问它的保留计数时,我得到的结果是0。但是如果我在实现文件中声明这个对象并访问它的retainCount,它就会抛出Bad_Access。您能告诉我为什么会发生这个错误吗?
发布于 2011-04-26 18:22:51
首先:您不应该在应用程序中访问任何对象的retaincount。
回答你的问题:
object1是一个实例变量,它在未初始化时指向nil。当您向nil发送消息时,它将返回nil (在这里,0).object2是一个没有设置任何内容的指针,甚至没有设置为nil,所以它可能指向任何内容。这里,它指向一个不存在的对象,所以它崩溃了。发布于 2011-04-26 18:20:29
我不知道你为什么要这么做,但是这段代码:
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];发布于 2011-04-26 18:22:49
因为当您在类中将其声明为实例变量时,它将自动使用nil进行初始化。并且[nil retainCount]再次返回nil,它在打印为整数时为0 (%d)
但是在本地声明的变量不会被初始化,这样的指针就指向某个地方,很可能指向未分配的内存块。而且,由于尝试访问未分配的内存位置会导致EXC_BAD_ACCESS,因此您会遇到您所描述的错误。
https://stackoverflow.com/questions/5788885
复制相似问题