Что значит id _Nullable __autoreleasing * _Nonnull? - PullRequest
0 голосов
/ 10 февраля 2020

Я запутался с использованием (out id _Nullable *) в кодовых документах и ​​ошибкой, которую мой фрагмент выдает мне.

#import <Foundation/Foundation.h>

void getvalue(char *a, bool *value){
  @autoreleasepool {
    NSURL *url = [[NSURL alloc] initFileURLWithFileSystemRepresentation:a 
                                                            isDirectory:NO 
                                                          relativeToURL:nil];
    [url getResourceValue:value 
                   forKey:NSURLIsDirectoryKey 
                    error:nil];
  }
}

void main (int argc, const char * argv[])
{
  bool value[10];
  char a[] = "a";
  getvalue(a, value + 4);
}

Невозможно инициализировать параметр типа 'id _Nullable __autoreleasing * _Nonnull' с lvalue типа 'bool *'

Что означает _Nullable * _Nonnull и что я делаю не так в коде?

Ссылка:

getResourceValue:forKey:error:

- (BOOL)getResourceValue:(out id  _Nullable *)value 
                  forKey:(NSURLResourceKey)key 
                   error:(out NSError * _Nullable *)error;

1 Ответ

4 голосов
/ 10 февраля 2020

_Nullable * _Nonnull не проблема здесь. Проблема в том, что вы передаете указатель на bool, когда вам нужно передать указатель на указатель на объект. getResourceValue:forKey:error: возвращает объект, а не примитив. В этом случае NSNumber .

    NSNumber *result = nil;
    [url getResourceValue:&result
                   forKey:NSURLIsDirectoryKey
                    error:nil];
    *value = [result boolValue];

На вопрос id _Nullable * _Nonnull означает «указатель, который не должен быть нулевым, на указатель объекта, который может быть нулевым «. Это стандартный шаблон возврата по ссылке в Obj C. id - это typedef для указателя на объект.

...