[英]Exc_bad_acces in didUpdateLocations when app becomes active
[英]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
我認為問題出在這里:
[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.