【问题标题】:Implicit conversion of a non-Objective-C pointer type 'SEL' to 'NSString * _Nonnull' is disallowed with ARC [duplicate]ARC 不允许将非 Objective-C 指针类型“SEL”隐式转换为“NSString * _Nonnull”[重复]
【发布时间】:2016-04-25 17:19:42
【问题描述】:

我阅读了 5 个其他相关的 questions 相同的错误或 syntax。据我了解,与我的问题无关。

-(void) createCopyOfDBIfNeeded{
    NSFileManager *fileManager= [NSFileManager defaultManager];

    BOOL isDatabaseInCache = [fileManager fileExistsAtPath:@selector(getDBFile)];

    if (isDatabaseInCache) {
        return;
    }
}

//getDBFile方法:

-(NSString *) getDBFile {
    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString * DBPath = [paths firstObject];
    NSString * DBFile = [DBPath stringByAppendingPathComponent:@"productDBFile.db"];
    return DBFile;

}

似乎该错误与@selector(getDBFile) 有关。 如果我使用 [self getDBFile] 代替一切正常,但我想了解如何以及在何处适当地使用 @selector 以及错误/警告在这里的含义。

我也收到警告:Incompatible pointer types sending 'SEL' to parameter of type


编辑:这个问题基本上是What's the difference between a method and a selector?的副本

【问题讨论】:

  • 您似乎不知道选择器是什么,并且可能对函数以及如何调用它们了解甚少。也许一个好的 Objective-C 入门是为了。
  • @asma22 请注意,Objective-C 中的方法永远不应以 get 为前缀,除非它们遵循通过参数通过引用返回内容的非常特定的模式。 (常见的混淆点——欢迎使用该语言并玩得开心!)。
  • @bbum (sensei) 在一次排版聚会上有人告诉我最好避免使用--,而应该使用Em Dash(—)Ctrl + shift + - :]。感谢您的欢迎
  • @asma22 哈!你们这些年轻人和你们新奇的非 7 位字符。 :) 说真的,objc 中的 setter/getter 对是 always thingsetThing:。一个只读的 getter 就是 thing。遵循约定还使用@property(readonly) NSString *thing; just work

标签: ios objective-c xcode selector


【解决方案1】:

您只能将选择器传递给采用选择器的方法。 fileExistsAtPath: 采用 NSString *,而不是 SEL

您似乎想将getDBFile 的返回值传递给fileExistsAtPath:,而不是getDBFile 的选择器。

如果是这样,只需调用 getDBFile 而不是使用它的选择器:

BOOL isDatabaseInCache = [fileManager fileExistsAtPath:[self getDBFile]];

【讨论】:

  • 您能否详细说明您的第一行,我正在传递一个返回字符串的SEL,为什么与您的答案不同?你的意思是该方法必须能够接受某种performSelector 输入选项吗?我怎么知道一个方法是否接受?
  • @asma22 您正在将方法本身传递给期望方法结果的东西。
  • @asma22 系统希望您将文件名传递给它,但您传递的是获取文件名的指令,这是它不期望的。我的示例按照说明获取文件名,然后将结果传递给系统。这有意义吗?
  • 我知道它不期待一个......我不明白什么时候会有一些方法期待一个。 :]
  • @asma22 当某些代码需要能够运行其他一些代码时,选择器很有用,而在编译时不知道其他代码是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
相关资源
最近更新 更多