0

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

プロパティ (@property NSMutableString *inputName;) を宣言するときに、属性を割り当てませんでした。しかし、(strong) を追加すると、上記の警告は表示されません。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;
}
4

2 に答える 2

2

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

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

したがって、強い参照を使用せずにプロパティを作成し、それに代入すると、当然のことながら、コンパイラはこれが安全ではないことを警告します。

ベスト プラクティスでは、ivar にはプロパティによってのみアクセスし、プロパティはケースの正しいメモリ管理原則を表すことをお勧めします。この場合、あなたの財産は(強い、非原子的)であるべきだと私には思えます。

//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
于 2012-05-08T17:07:30.397 に答える
1

strongはデフォルトではありません。 assignがデフォルトです。

于 2012-05-08T17:04:26.603 に答える