Ich verwende derzeit das iOS 5 SDK, um meine App zu entwickeln. Ich versuche, einen NSString zu einer Eigenschaft zu machen und ihn dann in der .m-Datei zu synthetisieren (ich habe dies zuvor ohne Probleme getan). Nun stieß ich auf Folgendes: "Semantisches Problem: Der synthetisierte Getter von Property folgt der Kakao-Namenskonvention für die Rückgabe von 'eigenen' Objekten."
Dies ist mein Code: .h
@interface ViewController : UIViewController {
NSString *newTitle;
}
@property (strong, nonatomic) NSString *newTitle;
.m
@synthesize newTitle;
Hat jemand eine Ahnung, wie ich das beheben könnte? Vielen Dank!!
Antworten:
Ich vermute, dass die von Ihnen verwendete Compilerversion auch für deklarierte Eigenschaften den Speicherverwaltungsregeln folgt - insbesondere für die Accessoren der deklarierten Eigenschaften:
Eine Eigenschaft mit dem Namen
newTitle
ergibt bei der Synthese eine aufgerufene Methode-newTitle
, daher die Warnung / der Fehler.-newTitle
soll eine Getter-Methode für dienewTitle
Eigenschaft sein, Namenskonventionen besagen jedoch, dass eine Methode, deren Name mit beginnt,new
ein Objekt zurückgibt, das dem Aufrufer gehört, was bei Getter-Methoden nicht der Fall ist.Sie können dies lösen durch:
Umbenennen dieser Eigenschaft:
Behalten Sie den Eigenschaftsnamen bei und geben Sie einen Getter-Namen an, der nicht mit einem der speziellen Präfixe für Methodennamen beginnt:
Behalten Sie sowohl den Eigenschaftsnamen als auch den Getter-Namen bei und teilen Sie dem Compiler mit, dass der Getter-Name, obwohl er mit beginnt
new
, zurnone
Methodenfamilie und nicht zurnew
Methodenfamilie gehört:Beachten Sie, dass, obwohl Sie mit dieser Lösung
newTitle
sowohl den Eigenschaftsnamen als auch den Getter-Namen beibehalten können, eine Methode namens-newTitle
, die kein Objekt zurückgibt, das dem Aufrufer gehört, für andere Personen, die Ihren Code lesen, verwirrend sein kann.Apple hat Transitioning to ARC Release Notes veröffentlicht , in denen Folgendes angegeben ist:
Sie wurden bereits darüber informiert, dass ihre Aussage nicht ganz korrekt ist: Der Schuldige ist der Name der Getter-Methode, nicht der Name der Eigenschaft.
Bearbeiten 17. Januar 2015: Ich habe kürzlich ein Commit für Clang bemerkt , das Option 3 oben (unter Verwendung
objc_method_family(none)
) einschließlich eines Fix-it für den allgemeinen Fall vorschlägt , in dem ein Eigenschaftsname mit einem der Präfixe der speziellen Methodenfamilie übereinstimmt. Xcode wird diese Änderung wahrscheinlich irgendwann übernehmen.quelle
NS_RETURNS_NOT_RETAINED
ist was du auch brauchst.Inakzeptable Objektnamen
Akzeptable Objektnamen
#arc # automatisch synthetisiert # xcode-4.6.1
** BEARBEITEN **
Anscheinend können Sie mutableCopy auch nicht verwenden .
quelle
Der Name des Mitglieds, das mit new beginnt, löst die Warnung aus. Ändern Sie den Namen in editierter Titel und die Warnung wird ausgeblendet. Ich konnte keine Dokumentation finden, die dies bestätigt, aber durch Testen konnte festgestellt werden, dass Mitgliedsvariablen, die mit 'neu' beginnen, den Compiler erschweren.
quelle
ARC erlaubt nicht, "Neu ...." im Eigenschaftsnamen zu verwenden. Sie können jedoch "newTitle" verwenden, indem Sie den Getter-Namen ändern.
quelle
Es sieht nicht so aus, als ob Bavarious vorgeschlagen hätte, was Sie tun wollten. Sie möchten lediglich eine Instanzvariable deklarieren
NewTitle
und dann die Eigenschaft synthetisieren. Früher mussten wir die Instanzvariable und die Eigenschaft deklarieren. Nicht mehr.Ich glaube, der richtige Weg, dies zu tun, ist der folgende:
.h
.m
Die Instanzvariable für die Eigenschaft
newTitle
wird synthetisiert. Sie möchten nicht, dass Ihre Instanzvariable mit Ihrer Eigenschaft übereinstimmt - zu leicht, um Fehler zu machen .Siehe Beispiel: Eigenschaften deklarieren und Accessoren synthetisieren
quelle
NS_RETURNS_NOT_RETAINED
ist was du brauchst.Wenn Sie in CoreData das Attribut "new ..." verwenden (normalerweise kompilieren), stürzt es zufällig mit der Ausnahme "bad access" ab.
Es gibt kein Absturzprotokoll und die Zeile mit dem Haltepunkt "Alle Ausnahmen" hilft Ihnen überhaupt nicht.
quelle
Durch manuelles Schreiben eines Setters mit demselben Namen wie der Eigenschaft wurde diese Warnung entfernt.
quelle
Neben dem Problem, dass Sie "neu" vor Ihren Eigenschaftsnamen verwenden sollten / können, sagen wir noch eines: Versuchen Sie, "neu" vor Namen im Allgemeinen zu vermeiden. "Neu" ist zeitabhängig. Derzeit ist es neu für Sie, aber einige Zeit später möchten Sie vielleicht wieder etwas Neues implementieren. Die Verwendung von "neu" in Namen ist also immer schlecht. Versuchen Sie so zu denken: In der Programmierwelt schafft "neu" immer etwas: eine neue Instanz von etwas.
In Ihrem Fall, wenn Sie einen anderen Titel als den aktuellen Namen Ihrer Eigenschaft titleReplacement zuweisen möchten.
Noch etwas: Versuchen Sie, Funktionen und Methoden zuerst mit dem Verb zu benennen, z. B. setSomething oder getSomething. Versuchen Sie jedoch in Eigenschaften, das Objekt zuerst zu benennen, z. B. heightMinimum, heightMaximum usw. -> Wenn Sie beim Codieren Ihren Inspektor verwenden, suchen Sie immer nach Objekten. Versuch es. ;-);
quelle
NS_RETURNS_NOT_RETAINED
wird verwendet, um das Namensproblem zu lösen.Wir können seine Definition wie folgt finden:
Weitere Details hier anhängen .
quelle
Versuche dies:-
quelle