首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >错误:访问对象的retainCount时出现EXC_Bad_Access

错误:访问对象的retainCount时出现EXC_Bad_Access
EN

Stack Overflow用户
提问于 2011-04-26 18:17:22
回答 3查看 468关注 0票数 0

在头文件.h中

代码语言:javascript
复制
@interface MemoryAppDelegate:NSObject <UIApplicationDelegate> {
Class1 *class1_obj;
}

在实现文件.m中

代码语言:javascript
复制
@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。您能告诉我为什么会发生这个错误吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-26 18:22:51

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

回答你的问题:

  • object1是一个实例变量,它在未初始化时指向nil。当您向nil发送消息时,它将返回nil (在这里,0).
  • object2是一个没有设置任何内容的指针,甚至没有设置为nil,所以它可能指向任何内容。这里,它指向一个不存在的对象,所以它崩溃了。
票数 2
EN

Stack Overflow用户

发布于 2011-04-26 18:20:29

我不知道你为什么要这么做,但是这段代码:

代码语言:javascript
复制
 Class2 *class2_obj;
 NSLog(@"Retain Count of class2_obj %d",[class2_obj retainCount]); // gives EXC_Bad_Access error

只创建指向特定类型对象的指针,而不是实际创建实例。所以访问它并询问它的retainCount (你一开始就不应该这样做)将导致有效的崩溃。因为它还不是一个有效的对象。请先尝试初始化它。

更新:如果你坚持这样做,这里有一些可能有效的方法

代码语言:javascript
复制
Class2 *class2_obj = [[Class2 alloc] init];
NSLog(@"Retain Count of class2_obj %d",[class2_obj retainCount]); // gives retain count of 1
[class2_obj release];
票数 2
EN

Stack Overflow用户

发布于 2011-04-26 18:22:49

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

但是在本地声明的变量不会被初始化,这样的指针就指向某个地方,很可能指向未分配的内存块。而且,由于尝试访问未分配的内存位置会导致EXC_BAD_ACCESS,因此您会遇到您所描述的错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5788885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档