2012-05-08 10 views
0

私はinputName(NSMutableString)というivarを持つEngineという単純なクラスを作成しました。プロパティは設定されており、すべて正常に動作します。私が作成したエンジンのインスタンスcarを作成し、inputNameを設定すると、次の警告が表示されます。 危険なプロパティに保持されたオブジェクトを割り当てると、割り当て後にオブジェクトが解放されます。 メッセージとは別に、car.inputNameにメモリが割り当てられ、正しく初期化されています。ivar(NSMutableString)を作成すると警告が表示されます

プロパティ(@property NSMutableString * inputName;)を宣言するとき、私は属性を割り当てませんでした。しかし、私が(強く)追加すると、私は上記の警告を得ることはありません。 strongがデフォルト属性の場合はどうすればよいですか? car.inputNameに文字列を与える最良の方法は何でしょうか。

#import "Engine.h" 
#import <Foundation/Foundation.h> 

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 

     Engine *car = [[Engine alloc]init]; 
     car.inputName = [[NSMutableString alloc]initWithString:@"Ford Escot"]; 
     // yellow warning:Assigning retained object to unsafe property, object will be released after assignment 

    } 
    return 0; 
} 
+0

おそらくこれはARCプロジェクトですか? – trojanfoe

+0

@trojanfoe - はい - これはARCプロジェクトです – pete

答えて

1

strongはデフォルトではありません。 assign is the default.

+0

Thanks Jim。それはなぜ私は強い属性を追加すると、エラーメッセージが行くことです。 – pete

2

__strongは、基礎となるインスタンス変数のデフォルトです。インスタンス変数をそのようなものとして宣言しただけで(例えば、付随するプロパティなし)、ivarに直接割り当てると、警告なしでコンパイルする必要があります(ただし、ベストプラクティスは無視されます)。

インスタンス変数にアクセスするためのプロパティを作成すると、デフォルトのメモリ管理が割り当てられますが、これは安全ではありません。

したがって、強力な参照を使わずにプロパティを作成してから割り当てを行うと、コンパイラは安全でないと警告します。

ベストプラクティスでは、プロパティによってivarsにアクセスすることをお勧めします。そのプロパティは、ケースに対する正しいメモリ管理原則を表しています。この場合、あなたの財産は(強く、非原子的な)ものでなければならないと私には思われます。

//h 

@interface SomeClass 
{ 
    Engine *__anEngine; // will be __strong 
} 

@property (nonatomic) Engine *anEngine; //will be assign 

//m 
Engine *car = [[Engine alloc] init]; 

__anEngine = car; //retained 
self.anEngine = car; //not retained 
関連する問題