2016-04-25 4 views
-3

nicht zulässig. Ich lese 5 andere ähnliche questions mit dem gleichen Fehler oder syntax. Soweit ich verstanden habe, hatte nichts etwas mit meiner Frage zu tun.Implizite Konvertierung eines Nicht-Objective-C-Zeigertyps 'SEL' in 'NSString * _Nonnull' ist mit ARC

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

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

    if (isDatabaseInCache) { 
     return; 
    } 
} 

// getDBFile Methode:

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

} 

Es scheint der Fehler @selector(getDBFile) zusammenhängt. Wenn ich [self getDBFile] stattdessen alles funktioniert, aber ich möchte lernen, wie und wo @selector geeignet zu verwenden und was der Fehler/Warnung bedeutet hier.

Ich habe auch eine Warnung: Incompatible pointer types sending 'SEL' to parameter of type

+4

Sie könnten diese lesen wollen: https://developer.apple.com/library/mac/documentation/General/Conceptual/DevPedia -CocoaCore/Selector.html – jtbandes

+2

Es sieht so aus, als ob Sie keine Ahnung haben, was ein Selektor ist, und möglicherweise wenig Verständnis für Funktionen und wie man sie aufruft. Vielleicht ist ein guter Objective-C-Primer in Ordnung. – Avi

+1

@ asma22 Beachten Sie, dass Methoden in Objective-C niemals mit "get" vorangestellt werden sollten, es sei denn, sie folgen einem sehr spezifischen Muster der Rückgabe von Objekten durch Referenz über die Argumente. (Gemeinsamer Punkt der Verwirrung - Willkommen in der Sprache und viel Spaß!). – bbum

Antwort

2

Sie nur einen Selektor auf ein Verfahren, das einen Selektor nimmt passieren kann. fileExistsAtPath: dauert ein NSString *, kein SEL.

Es sieht so aus, als ob Sie den Rückgabewert von getDBFile an fileExistsAtPath:, nicht getDBFile 's Selektor übergeben möchten.

Wenn ja, nur getDBFile rufen statt dessen Wähler des Nehmens:

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

können Sie über Ihre erste Zeile, übergeben ich eine' SEL ', die eine Zeichenfolge zurückgibt, warum unterscheidet sich von der Antwort? Meinst du, die Methode muss in der Lage sein, eine Art von 'performSelector'-Eingabeoption zu akzeptieren? Woher weiß ich, ob eine Methode dies akzeptiert oder nicht? – Honey

+0

@ asma22 Sie übergeben die Methode selbst an etwas, das das Ergebnis einer Methode erwartet. – NobodyNada

+2

@ asma22 Das System erwartet, dass Sie ihm den Dateinamen übergeben, aber Sie übergeben stattdessen Anweisungen, um den Dateinamen zu erhalten, was er nicht erwartet. Mein Beispiel folgt den Anweisungen zum Abrufen des Dateinamens und übergibt das Ergebnis dann an das System. Ist das sinnvoll? – NobodyNada

Verwandte Themen