Ich vermute, dass die von Ihnen verwendete Compilerversion auch für deklarierte Eigenschaften den Speicherverwaltungsregeln folgt - insbesondere für die Accessoren der deklarierten Eigenschaften:
Sie übernehmen das Eigentum an einem Objekt, wenn Sie es mit einer Methode erstellen, deren Name mit "alloc", "new", "copy" oder "mutableCopy" beginnt.
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 die newTitle
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:
@property (strong, nonatomic) NSString *theNewTitle;
Behalten Sie den Eigenschaftsnamen bei und geben Sie einen Getter-Namen an, der nicht mit einem der speziellen Präfixe für Methodennamen beginnt:
@property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
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
, zur none
Methodenfamilie und nicht zur new
Methodenfamilie gehört:
#ifndef __has_attribute
#define __has_attribute(x) 0 // Compatibility with non-clang compilers
#endif
#if __has_attribute(objc_method_family)
#define BV_OBJC_METHOD_FAMILY_NONE __attribute__((objc_method_family(none)))
#else
#define BV_OBJC_METHOD_FAMILY_NONE
#endif
@interface ViewController : UIViewController
@property (strong, nonatomic) NSString *newTitle;
- (NSString *)newTitle BV_OBJC_METHOD_FAMILY_NONE;
@end
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 können einer Eigenschaft keinen Namen geben, der mit new
oder beginnt copy
.
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.