簡體   English   中英

為什么我得到EXC_BAD_ACCES

[英]Why am i getting a EXC_BAD_ACCES

嘿。 我一直在處理Twitter應用程序,並且在相當長一段時間內一直停留在EXC_ BAD_ ACCESS錯誤中。 我知道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循環中拋出的,但是在退出時才顯示出來。

這是Person的實現文件:

@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];

由於您是使用arrayWithContentsOfFile創建propList的,因此不需要釋放它-它會自動釋放。 自動釋放實際上是導致錯誤的原因,因為它試圖釋放您已經手動釋放的東西。

預計到達時間:如cobbal所述,您也不需要釋放path

調試EXC_BAD_ACCESS很難調試。 當消息發送到已經釋放的對象時,就會發生這種情況。 您需要通過打開NSZombiEnabled環境變量來找出導致此一般錯誤的原因,以便Objective-C環境能夠“跟蹤”已釋放的對象。 使用此方法,當您收到錯誤消息時,可以通過查看調用堆棧來確定錯誤發生的位置。 您將不知道它的發布位置,但至少它會讓您接近。

我在這里沒有設置它,但是您可能還會傳遞一個指向錯誤的指針,該錯誤將導致該對象無法作為僵屍/虛擬對象持久存在。

最重要的是,您需要確定要釋放的變量,並根據需要保留它們。

蘋果公司的技術問答對使用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對象,而是將它們置於僵屍狀態,從而在隨后訪問它們時引發異常。 只是要確保不要釋放設置了此標志的代碼,因為它會像篩子一樣泄漏內存。

什么是self.editButtonItem? 我在您的.h文件中看不到它

有幾件事。

  • initWithUserName:您從不包含alloc / copy / create的方法獲取信息。 此外,您沒有明確保留它。 但是您釋放它。 假設fetchInfoForUsername:這是有問題的,則根據可可內存管理規則按預期自動釋放其結果。

  • 在初始值設定項中使用屬性訪問器被認為是錯誤的形式,因為它可能導致半熟實例發送KVO通知。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM