我最近开始学习Objective-C,我正在开发一个iOS应用程序作为练习,无论如何,我想通过抛出异常来处理溢出(我来自Java背景),我只搜索引用NSException,但后来我阅读有关异常处理主题的部分,他们说要使用NSError,我读了参考但他们有相同的协议和方法,那么它们之间的区别是什么?哪个更好?
另外,我想创建自己的异常或错误类,是否应该包含任何方法或字段?(就像Exception在Java中实现接口时一样).谢谢
在尝试迁移到Swift 3时(在包含大约一半/半swift/objective-c代码的项目中),我遇到了一个问题.我们在objective-c中声明这个特定的协议,如下所示:
@protocol AProtocolDeclaration <NSObject>
- (void)someEventHappened:(nullable NSError *)error;
@end
Run Code Online (Sandbox Code Playgroud)
Swift编译器为上面的协议声明生成以下内容:
public protocol AProtocolDeclaration : NSObjectProtocol {
public func someEventHappened(_ error: Error?)
}
Run Code Online (Sandbox Code Playgroud)
当在a中实现协议concrete class (in swift)并尝试定义生成的方法时,我会继续得到类似的错误:无法转换Error to NSError.我不知道如何解决这个错误.有人可以建议吗?
我对objective-c很新,我开始想知道处理和捕获错误的常用/标准/正确方法是什么?
似乎有可能使用NSError来做到这一点,这是一个好主意还是劫持可可?
这是来自Apple示例代码:
if (![fetchedResultsController_ performFetch:&error]) {
/*
Replace this implementation with code to handle the error appropriately.
...
If it is not possible to recover from the error, ...
*/
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否真的有必要总是终止应用程序?你怎么能" 用代码替换这个实现来适当地处理错误 "?你将如何" 从错误中恢复 "?
任何建议都将受到赞赏,Fabian
我希望使用自动引用计数从项目的块中设置NSError指针.以下是我的代码的简化版本:
- (BOOL)frobnicateReturningError:(NSError **)error
{
NSArray *items = [NSArray arrayWithObjects:@"One", @"Two", @"Three", nil];
__block Frobnicator *blockSelf = self;
[items enumerateObjectsUsingBlock:^(id item, NSUInteger idx, BOOL *stop) {
[blockSelf doSomethingWithItem:item error:error];
}];
}
Run Code Online (Sandbox Code Playgroud)
这个编译但是给定error可以修改
doSomethingWithItem我尝试为要修改的块创建一个本地NSError,然后用于error在枚举之后设置原始(我没有显示):
- (BOOL)frobnicateReturningError:(NSError **)error
{
NSArray *items = [NSArray arrayWithObjects:@"One", @"Two", @"Three", nil];
__block Frobnicator *blockSelf = self;
__block NSError *blockError = nil;
[items enumerateObjectsUsingBlock:^(id item, NSUInteger idx, BOOL *stop) {
[blockSelf doSomethingWithItem:item error:&blockError];
}];
}
Run Code Online (Sandbox Code Playgroud)
无法编译时出现以下错误:
将非本地对象的地址传递给__autoreleasing参数以进行回写
谷歌搜索此错误只返回Clang源代码本身的结果.
一个看起来有效但有点难看的解决方案是有一个内部和外部错误指针:
- (BOOL)frobnicateReturningError:(NSError **)error …Run Code Online (Sandbox Code Playgroud) objective-c nserror objective-c-blocks automatic-ref-counting
在我的一台设备(运行iOS7的iPad mini)上,当我尝试在Game Center中进行身份验证时,我遇到了可怕的错误:
Authentication Error: Error Domain=GKErrorDomain Code=2 "The requested operation has been cancelled or disabled by the user." UserInfo=0x15ef0f00 {NSLocalizedDescription=The requested operation has been cancelled or disabled by the user.}
Run Code Online (Sandbox Code Playgroud)
我清楚地登录了Game Center.我已经完全从设备上擦除了应用程序,甚至在删除应用程序后从Xcode重新运行我仍然得到错误.
我可以毫无问题地使用其他设备登录.我在不同设备上登录了相同的GC帐户.只是在这个特定的设备上,它不会验证我的应用程序,也不会在Game Center应用程序的"游戏"列表中显示该应用程序.
有什么建议?
在我的自定义框架中,我有一个如下所示的方法,它从字典中获取值并将其转换为BOOL并返回布尔值.
- (BOOL)getBoolValueForKey:(NSString *)key;
Run Code Online (Sandbox Code Playgroud)
如果此方法的调用者传递了不存在的键,该怎么办?我应该抛出一个自定义的NSException,说密钥不存在(但是在目标c中不建议抛出异常)或者将NSError参数添加到此方法中,如下所示?
- (BOOL)getBoolValueForKey:(NSString *)key error:(NSError **)error;
Run Code Online (Sandbox Code Playgroud)
如果我使用NSError,我将不得不返回'NO',这将是误导,因为'NO'可以是任何有效密钥的有效值.
面对多功能调用中错误反向传播的问题.
例如,
NSError *error = nil;
EMSPlanFolder *planner = [[EMSPlanFolder sharedPlanBuilder] buildPlanFromParsePlan:plan withError:&error];
if (error) {
//error
}
Run Code Online (Sandbox Code Playgroud)
接下来,它的功能:
- (EMSPlanFolder*)buildPlanFromParsePlan:(EMParsedPlan*)parsedPlan withError:(NSError *__autoreleasing*)err
{
....
....
[self deserializePlan:parsedPlan forPlan:newPlanFolder allowingNoEndDate:NO withError:err];
if(err && *err) {
[newPlanFolder.managedObjectContext performBlockAndWait:^{
[EMSPlanFolder deletePlan:newPlanFolder];
}];
return nil;
}
return newPlanFolder;
}
Run Code Online (Sandbox Code Playgroud)
接下来,它将:
- (void)deserializePlan:(NSArray*)planElements forPlan:(LMSPlanFolder*)planFolder allowingNoEndDate:(BOOL)allowNoEndDate withError:(NSError *__autoreleasing*)err {
....
....
if(err) {
*err = [NSError errorWithDomain:@"Application" code:-1 userInfo:@{ NSLocalizedDescriptionKey:[NSString stringWithFormat:@"Plan was not found."]}];
}
return;
}
Run Code Online (Sandbox Code Playgroud)
问题是,当它返回传播到第一个代码片段时会导致崩溃.有任何建议
iOS 9.2.1,Xcode 7.2.1,ARC启用
我使用下面的方法来检查的失败SKProductsRequest和SKReceiptRefreshRequest:
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error
{
NSLog(@"error: %@", error);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是具体的SKReceiptRefreshRequest.我正在测试两个条件,(1)当用户取消登录到iTunes Store以获取收据请求时,以及(2)当用户尝试登录并且没有连接时(飞机模式).
我收到以下错误:
没有连接时:
错误域= SSErrorDomain代码= 110"无法连接到iTunes Store"UserInfo = {NSLocalizedDescription =无法连接到iTunes Store,NSUnderlyingError = 0x13c76d680 {错误域= NSURLErrorDomain代码= -1009"无法连接到iTunes Store"UserInfo = {NSLocalizedDescription =无法连接到iTunes Store,NSErrorFailingURLStringKey =
{您的产品ID和相应的URI}
,_kCFStreamErrorCodeKey = 8,_kCFStreamErrorDomainKey = 12,NSLocalizedDescription = Internet连接似乎处于脱机状态.}}}
当用户点击取消时:
错误域= SSErrorDomain代码= 16"无法连接到iTunes Store"UserInfo = {NSLocalizedDescription =无法连接到iTunes Store,NSUnderlyingError = 0x13c6ac7b0 {错误域= AKAuthenticationError代码= -7003"(null)"}}
我使用原始错误代码来区分错误并触发相应的UI事件来处理错误状态.但我一直在这样做,却没有理解底层错误是什么.
两者之间的常见错误域是SSErrorDomain.
有人可以详细说明SSErrorDomain是什么以及它属于哪个框架?另外,您能否提供一些有关此域名的所有可能错误代码的有用文档?
提前致谢!
尝试使用其中一个StoreKit常量时,我收到错误"使用未解析的标识符":
SKErrorClientInvalid
SKErrorPaymentCancelled
SKErrorPaymentInvalid
SKErrorPaymentNotAllowed
SKErrorStoreProductNotAvailable
SKErrorUnknown
Run Code Online (Sandbox Code Playgroud)
您的代码可能如下所示:
if transaction.error!.code == SKErrorPaymentCancelled {
print("Transaction Cancelled: \(transaction.error!.localizedDescription)")
}
Run Code Online (Sandbox Code Playgroud)
改变了什么?我需要导入一个新模块吗?
nserror ×10
ios ×7
objective-c ×7
nsexception ×2
storekit ×2
cocoa ×1
cocoa-touch ×1
exception ×1
game-center ×1
iphone ×1
swift ×1
swift2 ×1
swift3 ×1