Iphone 获取“;EXC#u坏访问”;从UITableView委托方法中访问实例变量时

Iphone 获取“;EXC#u坏访问”;从UITableView委托方法中访问实例变量时,iphone,uitableview,delegates,exc-bad-access,Iphone,Uitableview,Delegates,Exc Bad Access,当我的iPhone应用程序从其中一个UITableView委托方法中访问实例变量时,它会崩溃。我想我保留了它,所以我不明白为什么我不能毫无问题地访问它 这是我的.h文件 #import <Foundation/Foundation.h> #import "AlertSummaryCell.h" #import "AlertDetailViewController.h" @interface AlertSummaryTableViewController : UITableViewC

当我的iPhone应用程序从其中一个UITableView委托方法中访问实例变量时,它会崩溃。我想我保留了它,所以我不明白为什么我不能毫无问题地访问它

这是我的.h文件

#import <Foundation/Foundation.h>
#import "AlertSummaryCell.h"
#import "AlertDetailViewController.h"

@interface AlertSummaryTableViewController : UITableViewController {
NSDictionary *alerts;
NSString *alertKind;
}
我错过了什么

viewDidLoad方法完全没有问题:

 - (void)viewDidLoad {
 NSLog(@"AlertSummaryTableViewController.viewDidLoad entered");
 NSLog(@"  alerts description = %@", [alerts description]);

 // We want the View title to include the alert count
 // To know how many alert summaries we have, get the value for count out of the input dictionary
 int theCount = [[alerts objectForKey:@"count"] intValue];

 // Now construct the title text and set our views title to it
 NSString *myTitle = [[NSString alloc] initWithFormat:@"%@ Alerts (%d)",alertKind,theCount];
 [self setTitle: myTitle];

 // Memory cleanup
 [myTitle release];

 [super viewDidLoad];
 }

对于任何EXC_BAD_访问错误,您通常会尝试向已发布的对象发送消息。追踪这些信息的最佳方法是使用

这样做的方法是,永远不会真正释放对象,而是将其包装为“僵尸”,并在其内部设置一个标志,表示该对象通常会被释放。这样,如果您再次尝试访问它,它仍然知道在您出错之前是什么,并且有了这一点信息,您通常可以回溯到问题所在

当调试器有时在任何有用的信息上出错时,它在后台线程中尤其有用

但是,需要注意的非常重要的一点是,您需要100%确保这只出现在调试代码中,而不是发布代码中。因为从来没有发布过任何东西,所以你的应用程序会一个接一个地泄漏。为了提醒我这样做,我将此日志放在appdelegate中:

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

对于任何EXC_BAD_访问错误,您通常会尝试向已发布的对象发送消息。追踪这些信息的最佳方法是使用

这样做的方法是,永远不会真正释放对象,而是将其包装为“僵尸”,并在其内部设置一个标志,表示该对象通常会被释放。这样,如果您再次尝试访问它,它仍然知道在您出错之前是什么,并且有了这一点信息,您通常可以回溯到问题所在

当调试器有时在任何有用的信息上出错时,它在后台线程中尤其有用

但是,需要注意的非常重要的一点是,您需要100%确保这只出现在调试代码中,而不是发布代码中。因为从来没有发布过任何东西,所以你的应用程序会一个接一个地泄漏。为了提醒我这样做,我将此日志放在appdelegate中:

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

我想你已经检查过了,设置了警报。如果您尝试在一个nil引用上调用[alerts objectForKey:],您将得到该错误。

我假设您已经选中了设置警报。如果您尝试在一个nil引用上调用[alerts objectForKey:],则会出现该错误。

问题在于我设置警报的方式。我没有使用setter方法(该方法会保留对象),而是不知不觉地这样做了:

alerts = [[UIDictionary alloc] init];     // or something like this
它编译时没有任何警告或错误,我想应该是这样的

通过使用setter

[self setAlerts:[[UIDictionary alloc] init];   // again I'm going from memory so ...
我必须创建警报,警报按需要“保留”,加载视图控制器后一切正常


我对Objective-C非常陌生,不得不处理内存管理问题,但在使用Objective-C和iPhone SDK大约4周后,我终于看到了曙光。

问题在于我设置警报的方式。我没有使用setter方法(该方法会保留对象),而是不知不觉地这样做了:

alerts = [[UIDictionary alloc] init];     // or something like this
它编译时没有任何警告或错误,我想应该是这样的

通过使用setter

[self setAlerts:[[UIDictionary alloc] init];   // again I'm going from memory so ...
我必须创建警报,警报按需要“保留”,加载视图控制器后一切正常

我对Objective-C非常陌生,不得不处理内存管理问题,但在使用Objective-C和iPhoneSDK大约4周后,我终于开始看到了曙光