2011-08-05 27 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的评论,这听起来像是您尝试访问已经优化过的变量,即声明低于返回的变量。不要这样做!