2012-10-02 84 views
1

我正在將我的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]; 
} 

當我運行的儀器,我看,這是原因:

Instrument image 1

Instrument image 2

所以,從它在叫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 
+0

ARC禁用編譯器標誌是'-fno-objc-arc'而不是'-fno-obj-arc'。 – NJones

+0

您是否在所有代碼和所有庫源代碼中使用了靜態分析器?你是否消除了所有靜態分析儀的警告? –

+0

@Rob。是。我確實使用了靜態分析儀,但我沒有消除大部分。我正在逐一瀏覽這些文件,我不想做太多的修改,也無法回溯。很多問題隨着我使用的lib和使用lib的視圖控制器而增加。但是,改變它很難... – okysabeni

回答

0

如果您在您的項目轉換爲ARC,你應該在所有代碼啓用ARC。 Xcode會給你錯誤的地方,你正在做的事情,如調用autorelease,retainrelease。只需構建,修復錯誤,構建,修復錯誤......重複,直至成功構建。對於您使用的任何第三方代碼,您應該禁用ARC。對於您引用的任何第三方編譯庫,您應該能夠正常使用它們。

有關過渡的更多信息,請參閱here

+0

恩,那就是問題所在。由於我使用的庫涉及initWithDelegate,如果我嘗試將ARC用於使用PasscodeViewController的SettingsViewController,它會崩潰。 – okysabeni

+0

@Yko - 爲什麼會讓它崩潰? –

+0

傑斐遜。我更新了我的問題,並附加了關於爲什麼我沒有爲我的視圖控制器啓用ARC的更多信息。 – okysabeni