我正在开发一个iPhone应用程序,它涉及从相机上传完整张照片(通常每张介于1.5到2.0 MB之间)以及缩略图(小得多)上传到Amazon S3.
缩略图始终成功上传,但有时完整图像不会上传,当失败时,它们会失败并显示POSIX错误代码12,即ENOMEM.但是,我添加了调试代码来在错误发生时打印可用内存量,而且总是有一点免费,通常超过100 MB.
此外,当上传发生在3G上时,错误会更频繁地发生,而当它通过wifi发生时则更少 - 这看起来很奇怪,因为请求没有下载太多而且正在上传的文件已经在内存中了(我也试过了)从磁盘流式传输而没有任何改进).
我尝试使用NSURLConnection,Foundation CFHTTP*函数和ASIHTTPRequest库上传文件,但无论如何,错误都以相同的频率发生.甚至更奇怪的是,我所有的谷歌搜索都透露,最终用户有时会从Safari获得错误代码12 - 我还没有看到任何iOS开发者提到它.我正在使用继承的代码库,所以它可能有问题,但我甚至不确定要寻找什么.任何见解将不胜感激!
在我的iOS(iPhone/cocos2d)项目中,我发现我自己抛出的异常不会导致应用程序终止(它们只会导致当前函数退出,这会导致奇怪的半冻结行为).例如,以下代码导致崩溃:
NSArray* testArray = [NSArray arrayWithObjects:@"One", @"Two", @"Three", nil];
[testArray objectAtIndex:400];
Run Code Online (Sandbox Code Playgroud)
当我运行该代码时,我在控制台中得到以下内容,正如我所期望的那样:
2011-06-07 12:55:20.421 mansion-iphone[38184:207] *** Terminating app due to
uncaught exception 'NSRangeException', reason: '*** -[NSArray
objectAtIndex:]: index 400 beyond bounds [0 .. 2]'
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试引发异常(例如来自断言),除非我启用了"停止Objective-C异常",否则我会得到半冻结.这对我来说很好,但是当我的测试人员报告问题时会导致问题 - 因为应用程序没有崩溃,他们没有崩溃日志来发送给我.这是一个不起作用的异常示例:
NSException* e = [NSException exceptionWithName:NSInternalInconsistencyException
reason:[NSString stringWithFormat:@"%s %@", __PRETTY_FUNCTION__,
[NSString stringWithFormat:@"Invalid argument"]] userInfo:nil];
[e raise];
Run Code Online (Sandbox Code Playgroud)
关闭"停止Objective-C异常",这甚至不会向控制台发出消息 - 使用NSAssert会给我一个控制台消息,但仍然没有停止.因此,似乎Cocoa类生成的异常行为正确,但源自我的代码的异常不是.
我检查了我的代码和cocos2d,但没有发现任何似乎阻止异常的@try块; 有谁有想法?