我正在將我的iOS4項目轉換爲ARC。我正在使用一些外部庫,例如PTPasscodeViewController,AppPirater,Flurry。我一直到達一個EXC_BAD_ACCESS,這意味着我將一條消息發送到一個釋放對象。我使用儀器來追蹤它,但無法弄清楚如何解決它。我希望來自SO的人能指引我朝着正確的方向前進。將ARC與非ARC混合會生成EXC_BAD_ACCESS。怎麼修?
我的SettingsViewController編譯時沒有ARC(-fno-obj-arc)。
-(void)showSettings:(id)sender {
SettingsViewController *infoView = [[SettingsViewController alloc] init];
[infoView setIouArray:iouTableArray];
[[self navigationController] pushViewController:infoView animated:YES];
}
當我運行的儀器,我看,這是原因:
所以,從它在叫IouViewController我的主要根視圖控制器初始化圖片2,我看到發佈是從'main.m'?我假設它與main.m中的autorelease池有關。所以,我在轉換到ARC時犯的一個'錯誤'是,我將main.m更改爲啓用ARC的新項目的main.m。我不確定這是否會產生任何影響,但是我有其他EXC_BAD_ACCESS問題,並且這樣做會使其發揮作用。
供參考,這是我的main.m:
int main(int argc, char *argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([IouApp2AppDelegate class]));
}
}
由於產生額外注,當它崩潰,它跳躍與消息的main.m 「主題1:信號SIGKILL」。
我不知道我會做什麼沒有SO。感謝社區的所有幫助。
更新1:如果我嘗試使用ARC的SettingsViewController,我得到了一些錯誤,我不到舒適對付它。這是一個例子:
// passcode is correct, direct to PasscodeSettingsViewController
// self retain, autorelease might be needed so that you do not look access to where the navigationController is since we pop one
[[self retain] autorelease];
// if you set popViewControllerAnimated:YES, weird title things happen. DO NOT MESS!!!
[[self navigationController] popViewControllerAnimated:NO];
此代碼段是從PTPasscodeViewController示例代碼庫。使用ARC,它給我的錯誤:
[rewriter] it is not safe to remove an unused 'autorelease' message; its receiver may be destroyed immediately
ARC禁用編譯器標誌是'-fno-objc-arc'而不是'-fno-obj-arc'。 – NJones
您是否在所有代碼和所有庫源代碼中使用了靜態分析器?你是否消除了所有靜態分析儀的警告? –
@Rob。是。我確實使用了靜態分析儀,但我沒有消除大部分。我正在逐一瀏覽這些文件,我不想做太多的修改,也無法回溯。很多問題隨着我使用的lib和使用lib的視圖控制器而增加。但是,改變它很難... – okysabeni