我有以下代码:
@try {
NSSet *set = [NSKeyedUnarchiver unarchiveObjectWithData:mData];
}
@catch (NSException *exception) {
// Use default data
}
Run Code Online (Sandbox Code Playgroud)
在某些时候,似乎我没有正确归档并且mData已损坏.这给了我以下错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '*** -[NSKeyedUnarchiver initForReadingWithData:]:
incomprehensible archive (0x14, 0xffffff9a, 0xffffffd0, 0x1d, 0x9, 0x3d, 0x43, 0x3)'
*** Call stack at first throw:
Run Code Online (Sandbox Code Playgroud)
如果try/catch块不起作用,我该如何在这里检查异常?它不应该工作吗?
谢谢.
我有以下代码:
- (Item *) getRandomItem {
if (itemIDs == nil) {
[self parse];
}
NSArray * allKeys = [allItems allKeys];
int seed = arc4random()%[allKeys count];
return [self getItemByID:[allKeys objectAtIndex:seed]];
}
Run Code Online (Sandbox Code Playgroud)
它有时会在实时应用程序崩溃,但我们无法重现崩溃.我一直在试图分析报告并了解可能导致崩溃的原因,但我没有成功.我试图篡改allItems对象以产生崩溃的任何方式导致与此处报告的错误不同的错误.
我想帮助理解在什么情况下会发生以下崩溃:
Hardware Model: iPhone3,1
Code Type: ARM (Native)
Parent Process: launchd [1]
OS Version: iPhone OS 5.0.1 (9A405)
Report Version: 104
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000010
Crashed Thread: 0
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libobjc.A.dylib 0x3427eb30 _class_isInitialized
1 …Run Code Online (Sandbox Code Playgroud) 我在Mac App Store的OSX项目中添加了几个本地化,提交了应用程序,但只识别了英语(本地化:("英语"),取自ITC Binary Details).该产品在iTunes上运行,其中英语是唯一显示的语言.
使用自定义系统处理本地化字符串,因此我们不需要像English.lproj这样的额外文件夹.为了本地化应用程序,我刚刚在项目的Info.plist中添加了所有语言标识符,在CFBundleLocalizations关键字下,正如Apple在https://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual上所建议的那样./BPInternational/Articles/ChoosingLocalizations.html
应用程序可以通过其信息属性列表(Info.plist)文件通知系统它支持其他本地化.要指定捆绑包的.lproj目录中未包含的本地化,请将CFBundleLocalizations密钥添加到此文件中.键的值是一个字符串数组,每个字符串都包含一个ISO语言指示符,如"语言和语言环境指定"中所述.
plist文件中指定本地化的部分是:
<key>CFBundleLocalizations</key>
<array>
<string>en</string>
<string>de</string>
<string>fr</string>
<string>it</string>
<string>es</string>
<string>pt</string>
<string>nl</string>
<string>se</string>
</array>
Run Code Online (Sandbox Code Playgroud)
我过去在2个iOS应用程序上使用了完全相同的方法,并且它们都运行良好.我不明白为什么这次我们得到了不同的行为.有什么想法吗?
谢谢.
我有以下方法:
+ (NSString*) getMD5HashFromFile:(NSString*)filePath {
CFStringRef md5hash = FileMD5HashCreateWithPath((CFStringRef)filePath, FileHashDefaultChunkSizeForReadingData);
NSString *hashStr = (NSString*)md5hash;
CFRelease(md5hash);
return hashStr;
}
Run Code Online (Sandbox Code Playgroud)
我在模拟器上遇到随机崩溃,大概有20到30次执行.这不一致的事实并没有帮助我更深入地挖掘.
现在我再次看到代码,很明显md5hash在返回之前释放,这意味着返回的对象无效.返回的值以一致的方式在另一个方法中使用,有时会崩溃,但并非总是如此.我的问题是为什么这种情况很少发生而且并非总是如此
是否与Obj-C和C代码的混合以及自动释放池的工作方式有关?
注意:这个错误似乎是通过使用来修复的NSString *hashStr = [NSString stringWithString:(NSString*)md5hash],这对我来说很有意义.
我有两个项目,每个项目构建一个静态库,以及另一个使用两个静态库的项目.
两个静态库中的一个构建正常.另一个没有,原因是它的公共头文件在自定义shell脚本运行之前没有复制到build文件夹.
以下是对所发生情况的演示:
SampleA(工作的那个)
Compile MyClass1.cpp ...
Compile MyClass2.cpp ...
Libtool /Users/user/Library/Developer/XCode/DerivedData/.....
Libtool /Users/user/Library/Developer/XCode/DerivedData/.....
Libtool /Users/user/Library/Developer/XCode/DerivedData/.....
Create universal binary libSampleA.a ...
Copy SampleA.h ...in /Users/user/....
Copy MyClass1.h ...in /Users/user/....
Copy MyClass2.h ...in /Users/user/....
Run custom shell script 'Prepare Framework'
Stripping libSampleA.a
--- Build complete
Run Code Online (Sandbox Code Playgroud)
SampleB(不起作用的那个)
Compile OtherClass1.cpp ...
Compile OtherClass2.cpp ...
Libtool /Users/user/Library/Developer/XCode/DerivedData/.....
Libtool /Users/user/Library/Developer/XCode/DerivedData/.....
Libtool /Users/user/Library/Developer/XCode/DerivedData/.....
Create universal binary libSampleB.a ...
// >>>>> NO HEADER FILES ARE COPIED <<<<<<
Run custom shell script …Run Code Online (Sandbox Code Playgroud)