我对一个非常简单的“演示”应用程序有一个非常奇怪的问题。 基本上问题是,如果我使用单个参数进行类方法调用,并且此方法立即返回但在返回后定义了变量(见下文),那么调用堆栈会被损坏而其他一些变量也会被更改...我知道这听起来很疯狂,但这里是代码......
- (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
如果我在“测试”方法结束时移动返回,则一切正常......
编辑:我在评论中发布了问题的图片
Edit2:我重新映像了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 :(得分:2)
您是否在发布模式下进行调试?还是调试模式?如果您处于发布模式,那么您无法真正信任调试器告诉您的任何事情。
答案 1 :(得分:1)
如果您在编译时启用了优化,那么将在该代码中修改application
的唯一方法就是发布。故事结束。
test:
的实现,无论return语句在哪里,几乎都没有,它肯定不会影响父堆栈框架。
正如约书亚所说,你没有提供足够的信息来告诉你发生了什么。发布崩溃的回溯,对于初学者来说。
答案 2 :(得分:0)
根据您对Joshua Weinberg的评论,听起来您正在尝试访问已经优化的变量,即在下面返回的变量。不要那样做!