1. ホーム
  2. オブジェクティブC

[解決済み】セマンティックな問題。プロパティの合成ゲッターは、「所有する」オブジェクトを返すためのCocoa命名規則に従っている。

2022-04-01 09:03:07

質問

現在、iOS 5 SDKを使用してアプリを開発しようとしています。 NSStringをプロパティとして作成し、.mファイル内で合成しようとしています(以前も問題なく合成できました)。今、私はこれを見つけました: "意味上の問題。プロパティの合成ゲッターは、「所有する」オブジェクトを返すためのCocoa命名規則に従っています(")。

これは私のコードです。 .h

@interface ViewController : UIViewController {
     NSString *newTitle;
}
@property (strong, nonatomic) NSString *newTitle;

.m

@synthesize newTitle;

どなたか、これを修正する手がかりをお持ちの方はいらっしゃいませんか? ありがとうございます。

解決方法は?

推測ですが、お使いのコンパイラのバージョンは以下の通りです。 メモリ管理ルール も、宣言されたプロパティ、より具体的には、宣言されたプロパティのアクセサに対してです。

alloc", "new", "copy", "mutableCopy "で始まる名前のメソッドを使用してオブジェクトを作成した場合、そのオブジェクトの所有権を取得することになります。

という名前のプロパティは newTitle というメソッドを生成し、それを合成すると -newTitle そのため、警告やエラーが発生します。 -newTitle のゲッターメソッドであるはずです。 newTitle しかし、命名規則では、メソッド名が new は呼び出し元が所有するオブジェクトを返しますが、ゲッターメソッドの場合はそうではありません。

で解決できます。

  1. そのプロパティの名前を変更する。

    @property (strong, nonatomic) NSString *theNewTitle;
    
    
  2. プロパティ名を保持し、特殊なメソッド名の接頭辞のいずれかで始まらないゲッター名を指定する。

    @property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
    
    
  3. プロパティ名とゲッター名の両方を保持し、ゲッター名が 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 が、呼び出し元が所有するオブジェクトを返さない場合、他の人がコードを読むときに混乱する可能性があります。


ちなみに、アップルが公開している ARCへの移行に関するリリースノート と記載されています。

で始まる名前をプロパティに付けることはできません。 new または copy .

この発言は正確ではないことがすでに通知されています。


2015年1月17日を編集。 今気づいたのですが Clang への最近のコミット は、上記のオプション 3 を示唆しています。 objc_method_family(none) を含む)、プロパティ名が特殊なメソッドファミリーの接頭辞のいずれかに一致する一般的な場合について、fix-it があります。Xcodeはいずれこの変更を取り入れると思われます。