私の推測では、使用しているコンパイラのバージョンは、宣言されたプロパティのメモリ管理規則にも従っています。具体的には、宣言されたプロパティのアクセサについても同様です。
名前が「alloc」、「new」、「copy」、または「mutableCopy」で始まるメソッドを使用して作成した場合、オブジェクトの所有権を取得します。
という名前のプロパティをnewTitle
合成すると-newTitle
、というメソッドが生成されるため、警告/エラーが発生します。-newTitle
はnewTitle
プロパティのゲッターメソッドであると想定されていますが、命名規則でnew
は、名前が始まるメソッドは呼び出し元が所有するオブジェクトを返すとされていますが、ゲッターメソッドの場合とは異なります。
これは次の方法で解決できます。
そのプロパティの名前を変更する:
@property (strong, nonatomic) NSString *theNewTitle;
プロパティ名を保持し、特別なメソッド名のプレフィックスのいずれかで始まらないゲッター名を指定します。
@property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
プロパティ名とゲッター名の両方を保持し、ゲッター名がで始まる場合でもnew
、none
メソッドファミリーではなくメソッドファミリーに属していることをコンパイラーに伝えますnew
。
#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
このソリューションではnewTitle
、プロパティ名とゲッター名の両方を保持できますが-newTitle
、呼び出し元が所有するオブジェクトを返さないメソッドが呼び出されると、他の人がコードを読んで混乱する可能性があります。
参考までに、AppleはARCリリースノートへの移行を公開しました。
プロパティにnew
またはで始まる名前を付けることはできませんcopy
。
彼らの声明は正確ではないことが既に通知されています。原因はプロパティ名ではなく、getterメソッド名です。
2015年1月17日の編集:プロパティ名が特別なメソッドファミリープレフィックスのいずれかと一致する一般的なケースに対して、fix-itを含む上記のオプション3(を使用)を提案するClangへの最近のコミットに気づきましたobjc_method_family(none)
。Xcodeは最終的にこの変更を組み込む可能性があります。