2011-08-05 57 views
1

對於非常簡單的「演示」應用程序,我有一個很奇怪的問題。 基本上問題是,如果我使用單個參數進行類方法調用,並且此方法立即返回,但在返回後定義了變量(請參見下文),那麼調用堆棧會被損壞並且其他變量會被更改...我知道這聽起來很瘋狂,但這裏是代碼...函數調用後XCode 3.2.6堆棧​​損壞

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    // Override point for customization after application launch. 

    [self.window makeKeyAndVisible]; 

    NSError *er=[MLRESTRequest test:nil]; //<- this line modifies the "application" variable passed as first argument! 

    return YES; 
} 


@implementation MLRESTRequest 
+ (NSError*) test:(id)task 
{ 
    return nil; 

    NSURLResponse *responseHeaders=nil; 
    NSDictionary *responseHeadersDict=nil; 
    NSError *error=nil; 
    NSData *result=nil; 
    NSURL *urlToCall = nil; 
    NSMutableURLRequest *urlRequest=nil;  
    NSString *serverRequest=nil; 
    NSString *cookie=nil; 

    NSString *server=nil; 
    NSString *port=nil; 
    NSString *call=nil; 
    //return nil; 
} 
@end 

如果我提出在「測試」的方法結束返回那麼一切都OK ...

編輯:我張貼的圖片評論問題

編輯2:我重新映像了mac並安裝了新的xCode 3.2.6副本 - 問題消失了。可悲的是,幾天後我開始出現類似的問題......(從函數調用返回後,堆棧變量沒有任何原因被改變)......我在3.2.5和4.0上重新編譯了完全相同的代碼,問題又一次消失了。 。我不知道該怎麼做,但現在將遠離3.2.6

編輯3:如果有人仍然對這種情況感興趣 - 我已經證明3.2.6中使用的GCC 4.2是越野車 - 如果使用LLVM + GCC 4.2,則不會發生崩潰

+0

return語句後代碼的用途是什麼?它是否達到過? – Codo

+0

無目的 - 此代碼僅適用於「演示」 - 我遇到了非常複雜的項目問題,並縮小了解決此問題的難題......即,在返回後有一個變量定義...如果我刪除了變量或者在它們之後移動它的返回值 - 其正確... – Sunman

+0

什麼版本的XCode和您使用的編譯器?最近,我看到一些可以追溯到編譯器生成無效代碼的問題 - 儘管目前爲止它隻影響了發佈模式。 – Codo

回答

2

您是否正在以發行模式調試此版本?還是調試模式?如果你處於發佈模式,你不能真正相信調試器告訴你有關這種事情的任何信息。

+0

在調試模式下 - 如果我嘗試訪問「已損壞」的應用程序變量 - 生成「正常」EXC_BAD_ACCESS ... – Sunman

+0

有些事情您當時沒有告訴我們,或者您誤解了正在發生的事情。 –

1

將在該代碼中修改application的唯一方法,就像發佈一樣,如果您正在編譯時啓用了優化。故事結局。

test:的執行,無論return語句在哪裏,幾乎沒有任何東西,它肯定不會影響父堆棧幀。

正如約書亞所說,你沒有提供足夠的信息來告訴你發生了什麼事情。對於初學者來說,可以發佈崩潰的回溯。

0

根據您對Joshua Weinberg的評論,這聽起來像是您嘗試訪問已經優化過的變量,即聲明低於返回的變量。不要這樣做!