2012-06-07 5 views
0

в проекте, использующем сбор мусора: Clang Предупреждения «Потенциальная нулевая разметка ....» на линии, назначающей * anError.Как исправить предупреждение Clang в методе, используя двойную косвенность для NSError?

Но это смотреть прямо мне в соответствии с: Why does NSError need double indirection? (pointer to a pointer)

Может кто-нибудь увидеть то, что я не вижу?

- (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; 

}

+0

Это выглядит нормально для меня тоже, при условии, что входящие параметры хороши. Отправляется ли сообщение, если вы положили 'if (anError) {...}' вокруг вашего назначения на '* anError'? –

+0

да, но я не понимаю, как и почему, если (anError) { \t \t \t \t * anError = [NSError errorWithDomain: [errorA домен] Код: [errorA код] USERINFO: [errorA USERINFO]]; \t \t \t} будет называться? – lulu

+0

Это говорит вам, что вы не защищены от случая с чем-то, вызывающего 'NSData * data = [anObject bookmarkDataForCurrentURL: theURL error: nil];', который является истинным, но не компилятором, который, как правило, касался себя. –

ответ

0
if (errorA && anError) { 
    // error here 
    *anError = [NSError errorWithDomain:[errorA domain] code:[errorA code] userInfo:[errorA userInfo]]; 
} 

EDIT: Даже уборщик:

- (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; 
} 
+0

Кроме того, для чего вы используете theURL? Вы передаете нуль в bookmarkDataWithOptions: includingResourceValuesForKeys: relativeToURL: ошибка. – Anonymous

+0

Я передаю его как свойство NSManagedObject во время создания managedObject, поэтому для него это нормально, поэтому я могу скрыть создание NSManagedObject в методе вызывающего и изучить ошибку. ваша вторая идея дает предупреждение для меня «несовместимые типы указателей, отправляющих NSError ***] в« NSError ** » – lulu

+0

Typo. Изменено и anError для просто anError, которое должно исправить предупреждение. – Anonymous