为什么我得到一个EXC_BAD_ACCES

嘿。 我一直在一个Twitter的应用程序,并一直停留在EXC_ BAD_访问错误相当长的一段时间。 我知道,EXC_ BAD_ ACCESS是内存的问题,但我不能找出问题的所在。 这是我的代码示例:

- (void)viewDidLoad { [super viewDidLoad]; NSString *path = @"/Volumes/Schools/BHS/Student/740827/Documents/Forrest McIntyre CS193P/Presence2"; NSArray *propList = [NSArray arrayWithContentsOfFile:[NSBundle pathForResource:@"TwitterUsers" ofType:@"plist" inDirectory:path]]; people = [[NSMutableArray alloc]init]; for (NSString *name in propList) { Person *p = [[Person alloc] initWithUserName: name]; [people addObject: p]; [p release]; } // Uncomment the following line to display an Edit button in the navigation bar for this view controller. // self.navigationItem.rightBarButtonItem = self.editButtonItem; }

该异常被抛出的意见后,最后一个大括号。 我认为,这是真正的扔在for循环的地方,但恰恰说明了在退出。

下面是实现文件的人:

@implementation Person @synthesize image; @synthesize username; @synthesize displayName; @synthesize statusArray; -(id)initWithUserName:(NSString *)userName { if(self = [super init]) { self.username = userName; NSDictionary *info = [TwitterHelper fetchInfoForUsername:userName]; self.displayName = [info objectForKey:@"name"]; NSLog([NSString stringWithFormat:@"%@",[info objectForKey:@"profile_image_url"]]); NSString *imageURL2 = [NSString stringWithFormat:@"%@",[info objectForKey:@"profile_image_url"]]; self.image = [UIImage imageWithData: [NSData dataWithContentsOfURL: [NSURL URLWithString: imageURL2]]]; [info release]; self.statusArray = [TwitterHelper fetchTimelineForUsername:userName]; } return self; } @end

感谢您的帮助

编辑:这是PersonListViewController(包含viewDidLoad中的类)的头文件。 这只是告诉你那里的人是从哪里来的。

@interface PersonListViewController : UITableViewController { NSMutableArray *people; } @end

--------------解决方案-------------

因为你永远留住propListpath ,你不应该释放他们。

你应该,但是,放people

对于内存管理的概述,请参见内存管理编程指南

对于快速修复,尽量静态分析。

我认为这个问题是在这里:

[propList release];

由于您使用创建proplist这样arrayWithContentsOfFile你并不需要释放它-它会自动释放。 该自动释放实际上是什么导致错误,因为它试图释放的东西,你已经手动释放。

埃塔:作为cobbal提到的,你也不需要释放path

调试EXC_BAD_ACCESS很难调试。 这发生在当一个消息被发送到已释放的对象。 你需要找出被打开NSZombiEnabled环境变量导致此一般性的错误使Objective-C的环境下就能'轨道'一个释放的对象。 利用这一点,当你的错误,你可以确定发生通过查看调用堆栈中的错误。 你不会知道它被释放,但至少它会让你接近。

我没有把它设置在这里,但你也可以传递一个指针,这将导致对象不能持续的僵尸/假的错误。

底线是,你需要确保你的意思释放变量,它们是必须的,你保留。

该技术问答苹果给出了查找的bug EXC_BAD_ACCESS提示。

其一,这些都不是必要的,你的例子:

[path release];
[propList release];

因为:

path是一个字符串(总是存在)

propList会被自动释放

为任何EXC_BAD_ACCESS错误,通常是试图将消息发送到一个释放的对象。 追踪这些下来最好方法是使用NSZombieEnabled。

这种工作方式是从来没有真正释放的对象,但通过包装它作为一个“僵尸”,并设置里面一个标志,上面写着它通常会被释放。 这样一来,如果你尝试再次访问它,它仍然知道那是什么,你做了错误之前,并与信息这一点点,你通常可以原路返回,看看有什么问题了。

它在后台线程尤其是帮助在调试器有时会胡扯出任何有用的信息。

非常重要但必须注意的是,你需要100%确保这是只有在调试代码,而不是你的发行代码。 因为没有什么是有史以来发布,您的应用程序将泄漏和泄漏,泄漏。 提醒我要做到这一点,我就把这在日志中我的appdelegate:

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");

如果您需要帮助找到确切的路线,做一个构建与调试(CMD-Y),而不是构建与运行(CMD-R)。 当应用程序崩溃,调试器会告诉你究竟哪些行与NSZombieEnabled组合,你应该能够找出确切原因。

http://www.cocoadev.com/index.pl?NSZombieEnabled可以在跟踪EXC_BAD_ACCESS错误有用。 与其解除分配对象时,他们release这使他们成为引发异常随后访问时,他们一个僵尸状态D。 只要确保没有永远发布的代码具有这个标志,因为这将导致内存泄漏筛子一样。

什么是self.editButtonItem? 我没有看到它在你的.h文件中

一对夫妇的事情。

  • initWithUserName:你得到的不包含的alloc /复制/创建一个方法的信息。 此外,你不明确它保留下来。 然而,你松开。 这是有问题的假设fetchInfoForUsername:自动释放其结果作为根据可可存储器管理规则预期。
  • 在初始化使用属性访问被认为是不好的形式,因为它可能会导致志愿通知发送出去半生不熟的实例。
分类:iphone 时间:2015-03-15 人气:0
本文关键词: iPhone,目标C,叽叽喳喳
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.402 (s). 10 q(s)