289

現在、iOS5SDKを使用してアプリを開発しています。NSStringをプロパティにしてから、それを.mファイルで合成しようとしています(これは以前に問題なく実行しました)。今、私はこれに出くわしました:「セマンティックの問題:プロパティの合成されたゲッターは、「所有された」オブジェクトを返すためのCocoa命名規則に従います。」

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

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

.m

@synthesize newTitle;

誰かが私がこれを修正する方法の手がかりを持っていますか?ありがとう!!

4

10 に答える 10

619

私の推測では、使用しているコンパイラのバージョンは、宣言されたプロパティ、より具体的には宣言されたプロパティのアクセサのメモリ管理ルールにも準拠していると思います。

名前が「alloc」、「new」、「copy」、または「mutableCopy」で始まるメソッドを使用してオブジェクトを作成する場合、オブジェクトの所有権を取得します。

と呼ばれるプロパティはnewTitle、合成されると-newTitle、と呼ばれるメソッドを生成するため、警告/エラーが発生します。-newTitleはプロパティのgetterメソッドであると想定されていますがnewTitle、命名規則では、名前がで始まるメソッドnewは、getterメソッドの場合とは異なり、呼び出し元が所有するオブジェクトを返すと規定されています。

これは次の方法で解決できます。

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

    @property (strong, nonatomic) NSString *theNewTitle;
    
  2. プロパティ名を保持し、特別なメソッド名プレフィックスの1つで始まらないゲッター名を指定します。

    @property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
    
  3. プロパティ名とゲッター名の両方を保持し、ゲッター名がで始まる場合でも、メソッドファミリーではなく、メソッドファミリーnewに属していることをコンパイラーに通知します。nonenew

    #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日編集:プロパティ名が特別なメソッドファミリプレフィックスの1つと一致する一般的なケースについて、fix-itを含む上記のオプション3(を使用)を提案するClangへの最近のコミットに気づきました。objc_method_family(none)Xcodeは、最終的にこの変更を組み込む可能性があります。

于 2011-06-13T07:11:54.187 に答える
57

許容できないオブジェクト名

  • newButton
  • copyLabel
  • allocTitle

許容されるオブジェクト名

  • neueButton
  • mCopyLabel
  • _allocTitle

#arc#自動合成#xcode-4.6.1

** 編集 **

どうやら、 mutableCopyも使用できません。

于 2013-04-23T18:24:56.433 に答える
31

newで始まるメンバーの名前は、警告をトリガーするものです。名前をeditedTitleに変更すると、警告が消えます。これを確認するドキュメントを見つけることができませんでしたが、テストを通じて、「new」で始まるメンバー変数がコンパイラを悪化させることを確認できました。

于 2011-10-10T12:11:44.440 に答える
10

ARCでは、プロパティ名に「New....」を使用することはできません。ただし、ゲッター名を変更することで「newTitle」を使用できます。

@property (nonatomic, strong, getter=theNewTitle) NSString *newTitle;
于 2013-05-09T01:08:31.683 に答える
6

バヴァリアスが示唆していたことは、あなたがやりたかったことではなかったようです。インスタンス変数を宣言してからNewTitle、プロパティを合成するだけです。以前は、インスタンス変数とプロパティを宣言する必要がありました。もういや。

さて、これを行う正しい方法は次のとおりだと思います。

.h

@interface ViewController : UIViewController

@property (nonatomic, strong) NSString *newTitle;

.m

@synthesize newTitle = _newTitle; // Use instance variable _newTitle for storage

プロパティのインスタンス変数newTitleが合成されます。インスタンス変数をプロパティと同じにしたくはありません。間違いを犯しやすいのです。

例:プロパティの宣言とアクセサの合成を参照してください。

于 2011-08-09T19:44:47.627 に答える
4

CoreDataでは、属性で「new ...」を使用すると(通常どおりコンパイル)、「badaccess」例外でランダムにクラッシュします。

クラッシュログはなく、「AllExceptionsBreakpoint」で示されている行はまったく役に立ちません。

于 2013-11-07T10:52:28.303 に答える
3

プロパティと同じ名前のセッターを手動で作成すると、この警告が削除されました。

于 2012-02-07T18:03:19.200 に答える
1

プロパティ名の前に「new」を使用する必要がある/使用できないという問題に加えて、もう1つ、名前の前に「new」を使用しないようにしてください。「新規」は時間に依存します。現在は新しいものですが、しばらくしてから、何か新しいものをもう一度実装したいと思うかもしれません。したがって、名前に「new」を使用することは常に悪いことです。このように考えてみてください。プログラミングの世界では、「新しい」とは常に何かを作成することです。つまり、何かの新しいインスタンスです。

別のタイトルを割り当てたい場合は、現在の名前をプロパティtitleReplacementにします。

もう1つ、setSomethingやgetSomethingのように、最初に動詞を使用して関数とメソッドに名前を付けてみてください。ただし、プロパティでは、heightMinimum、heightMaximumなどのように、最初にオブジェクトに名前を付けてください。->コーディング時にインスペクターを使用する場合、常にオブジェクトを探します。やってみよう。;-)

于 2014-08-03T20:29:35.820 に答える
1

NS_RETURNS_NOT_RETAINEDネーミングの問題を解決するために使用されます。

@property (nonatomic, copy) NSString *newTitle NS_RETURNS_NOT_RETAINED;

その定義は次のようになります。

#define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))

'ns_returns_not_retained'属性は、'ns_returns_retained'を補完するものです。関数またはメソッドがCocoaの規則に従い、保持されたCocoaオブジェクトを返すように見える場合、この属性を使用して、返されたオブジェクト参照を、呼び出し元に返される「所有」参照と見なしてはならないことを示すことができます。Foundationフレームワークは、以下に示すものと機能的に同等のマクロNS_RETURNS_NOT_RETAINEDを定義します。

詳細はこちらに添付してください。

于 2018-08-01T01:12:34.210 に答える
-2

これを試して:-

@property (nonatomic,retain) NSString *newTitle;
于 2011-06-13T07:03:01.883 に答える