Cocoa 如何修复NSError的双间接寻址方法中的叮当警报?

Cocoa 如何修复NSError的双间接寻址方法中的叮当警报?,cocoa,clang,nserror,Cocoa,Clang,Nserror,在使用垃圾收集的项目中: Clang在线分配*错误时发出“潜在的空解引用…”警报 但我认为这是正确的: 有人能看到我没看到的吗 - (NSData *)bookmarkDataForCurrentURL:(NSURL *)theURL error:(NSError **)anError { NSArray *bkKeys = [CBPrepCommon bookmarkPropertyKeys]; NSError *errorA = nil; NSData *bkmark

在使用垃圾收集的项目中: Clang在线分配*错误时发出“潜在的空解引用…”警报

但我认为这是正确的:

有人能看到我没看到的吗

- (NSData *)bookmarkDataForCurrentURL:(NSURL *)theURL error:(NSError **)anError
{
    NSArray *bkKeys = [CBPrepCommon bookmarkPropertyKeys];
    NSError *errorA = nil;
    NSData *bkmark = [theURL bookmarkDataWithOptions:NSURLBookmarkCreationPreferFileIDResolution includingResourceValuesForKeys:bkKeys relativeToURL:nil error:&errorA];

    if (![bkmark length] > 0) {
    if (errorA) {
        // error here
        *anError = [NSError errorWithDomain:[errorA domain] code:[errorA code] userInfo:[errorA userInfo]];
    }
    return nil;
}
return bkmark;
}

编辑:更干净:

- (NSData *)bookmarkDataForCurrentURL:(NSURL *)theURL error:(NSError **)anError
{
    NSArray *bkKeys = [CBPrepCommon bookmarkPropertyKeys];
    NSData *bkmark = [theURL bookmarkDataWithOptions:NSURLBookmarkCreationPreferFileIDResolution includingResourceValuesForKeys:bkKeys relativeToURL:nil error:anError];

    if ([bkmark length] == 0) {
        return nil;
    }

    return bkmark;
}

假设传入的参数是好的,在我看来也没问题。如果你把
if(anError){…}
放在分配给
*anError
的周围,消息会消失吗?是的,但我不明白如果(anError){*anError=[NSError errorWithDomain:[errorA domain]code:[errorA code]userInfo:[errorA userInfo]];}会被调用吗?它告诉您,在调用
NSData*data=[anObject bookmarkDataForCurrentURL:theURL错误:nil]的情况下,您没有受到保护,这是正确的,但不是编译器通常关心的事情。我是否要在顶部检查以查看是否未引用错误--不确定如何编写该代码…如果&anError==nil{return;},因为调用方声明NSError*errorX=nil,然后将其作为&errorX插入方法调用中。如果(!anError),可以尝试
if(!anError){return;}
。我不知道这是否会让编译器感到高兴……或者您可以将测试保留在上面的注释中。另外,您使用URL的目的是什么?您将nil传递给bookmarkDataWithOptions:includingResourceValuesForKeys:relativeToURL:error。在managedObject运行期间,我将其作为NSManagedObject的属性传递创建,所以它可以为零,我想,这样我可以在调用方的方法中失败NSManagedObject的创建,并检查错误。您的第二个想法为我生成一个警告“不兼容的指针类型将NSError***]发送到NSError**”Typo.Changed&一个错误为一个错误,这应该可以修复该警告。
- (NSData *)bookmarkDataForCurrentURL:(NSURL *)theURL error:(NSError **)anError
{
    NSArray *bkKeys = [CBPrepCommon bookmarkPropertyKeys];
    NSData *bkmark = [theURL bookmarkDataWithOptions:NSURLBookmarkCreationPreferFileIDResolution includingResourceValuesForKeys:bkKeys relativeToURL:nil error:anError];

    if ([bkmark length] == 0) {
        return nil;
    }

    return bkmark;
}