+[NSData bookmarkDataWithContentsOfURL:]: 无法识别的选择器发送到 class

+[NSData bookmarkDataWithContentsOfURL:]: unrecognized selector sent to class

我正在尝试使用 Objective-C(或者可能是 C++;它是一个 .mm 文件)来解析别名文件的原始路径。不是很熟悉,我不知何故缺少 +- 方法的用法。我知道它们分别是 class 和实例方法,但实际上,下面的代码和指定的行给我以下警告和错误(在构建时):

Class method '+bookmarkDataWithContentsOfURL:' not found (return type defaults to 'id')

-

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[NSData bookmarkDataWithContentsOfURL:]: unrecognized selector sent to class 0x7fff88942cb8'

其中 0x7fff88942cb8 是根据 lldb 的 NSData 地址。

我应该在哪些文件中进行更改才能使 bookmarkDataWithContentsOfURL:error: and URLByResolvingBookmarkData 正常工作?

void *pathclass::resolveAliasFromURL(const char *filepath) const
{
  NSError *error = nil;
  NSString *filepathh = [[NSString alloc] initWithUTF8String:filepath];
  NSData *bookmarkk = [NSData bookmarkDataWithContentsOfURL:filepathh]; /*problematic line*/


  BOOL isstale = NO;
  NSURL *actual = [NSURL URLByResolvingBookmarkData:bookmarkk bookmarkDataIsStale:isstale error:error];/*another problematic line, but build fails already*/
  NSString *urlString = [actual absoluteString];
  NSLog(@"%@",urlString);
}

如有其他错误,请指出。

您对 bookmarkDataWithContentsOfURL: 的调用在几个方面是错误的:

签名看起来像这样:

+ (NSData *)bookmarkDataWithContentsOfURL:(NSURL *)bookmarkFileURL error:(NSError * _Nullable *)error;

首先,第一个参数的类型是NSURL*不是NSString*。接下来,您完全错过了错误参数(尽管为它定义了一个变量)。最后,该方法是 NSURL not NSData 上的 class 方法(NSData* 是 return 类型)。

因此,首先,将您的文件路径设为 NSURL*:

NSURL* bookmarkUrl = [NSURL URLWithString:filepathh];

然后,使用适当的参数调用函数:

NSData *bookmarkk = [NSURL bookmarkDataWithContentsOfURL:bookmarkUrl error:&error];

您应该对照 nil 检查 returned 值 - 如果它是 nil,则发生错误,并且错误信息将包含在 error 中。

documentation 很有帮助。

你对 URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error: 的调用有类似的问题:你缺少几个参数,第一个参数应该是 NSURL,等等。同样,documentation 应该有帮助。