3

このコードを書く方法は3つあります。3番目の方法は私を混乱させます。

最初の方法は問題なく機能します。

//.h
@property (weak, nonatomic) IBOutlet UIImageView *picImageStage;
//.m
NSString *name = [NSString stringWithFormat:@"allen.png"];
UIImage *image = [UIImage imageNamed:name];
UIImageView *t = [[UIImageView alloc]initWithImage:image];
self.picImageStage = t;

2番目の方法は正常に機能します。

//.h
@property (retain, nonatomic) IBOutlet UIImageView *picImageStage;
//.m
NSString *name = [NSString stringWithFormat:@"allen.png"];
UIImage *image = [UIImage imageNamed:name];
self.picImageStage = [[UIImageView alloc]initWithImage:image]; 

第三の道は間違っています。

//.h
@property (weak, nonatomic) IBOutlet UIImageView *picImageStage;
//.m
NSString *name = [NSString stringWithFormat:@"allen.png"];
UIImage *image = [UIImage imageNamed:name];
self.picImageStage = [[UIImageView alloc]initWithImage:image]; 

理由がわかりません。誰か助けてもらえますか?ありがとう

4

4 に答える 4

5

3番目のスニペットでは、 @ propertyをweakとして宣言しており、UIImageViewはすぐに割り当て解除されます。同じオブジェクトとの強い関係がない場合、弱い関係はゼロになるからです。

ほぼ同じである最初のスニペットでは、最初にUIImageViewをローカル変数に割り当てました。このローカル変数は、暗黙的に強い関係を使用します。ローカルの強力な変数のスコープ(つまり、このコードを実行するメソッド)を離れると、変数のスコープを離れる前に別の強力な割り当てを作成する場合を除いて、プロパティの割り当ても解除されます。これは、たとえば、UIImageViewを別のビューのサブビューとして追加した場合に発生します。別のビューにビューを追加すると、強力な関係が作成されます。

于 2012-12-20T07:44:42.207 に答える
4

これを説明する最も簡単な方法かもしれないので、3つすべてを調べてみましょう。

ナンバー1

//first method
//.h
@property (weak, nonatomic) IBOutlet UIImageView *picImageStage;
//.m
NSString *name = [NSString stringWithFormat:@"allen.png"];
UIImage *image = [UIImage imageNamed:name];
UIImageView *t = [[UIImageView alloc]initWithImage:image];
self.picImageStage = t;

+1の保持カウントでローカル変数UIImageViewを初期化しています。弱いプロパティは値の暗黙的な保持を呼び出さないため、self.picImageStageに格納されている値を所有していません。つまり、ローカルUIImageViewを宣言する関数がスコープ外を通過するとすぐに、ラッキーキャンパーになります。変数の割り当てが解除されます。

2番

//second method
//.h
@property (retain, nonatomic) IBOutlet UIImageView *picImageStage;
//.m
NSString *name = [NSString stringWithFormat:@"allen.png"];
UIImage *image = [UIImage imageNamed:name];
self.picImageStage = [[UIImageView alloc]initWithImage:image]; 

これは、私が話していた暗黙の保持になります。コンパイラは次の行を展開します。

self.picImageStage = [[UIImageView alloc]initWithImage:image]; 

self.picImageStage = [[[UIImageView alloc]initWithImage:image]retain]; 

あなたがそれを所有し、あなたが好きなようにそれを自由に使えることを意味します。

ナンバー3

//third method
//.h
@property (weak, nonatomic) IBOutlet UIImageView *picImageStage;
//.m
NSString *name = [NSString stringWithFormat:@"allen.png"];
UIImage *image = [UIImage imageNamed:name];
self.picImageStage = [[UIImageView alloc]initWithImage:image]; 

所有していない変数から弱いプロパティに割り当てるだけでなく、割り当てが呼び出されるとすぐに、変数は値を格納しません!これも、弱いポインターが割り当ての暗黙的な保持を呼び出さないためです。つまり、変数が保持される期間を制御することはできません。また、変数が非常に長く存続しないことは間違いありません。

于 2012-12-20T07:47:41.550 に答える
2

ここでは、weak代わりにプロパティを使用retainし、UIImageを使用して直接割り当てます...

また、UIImageViewをに割り当てる最初の段階では、picImageStageそれが直接等しく、picImageStage..に格納されるため、正常に機能します。

使用する場合

@property (retain, nonatomic) IBOutlet UIImageView *picImageStage;

それ以外の

@property (weak, nonatomic) IBOutlet UIImageView *picImageStage;

その後、この理由でうまく機能します。

于 2012-12-20T07:42:41.263 に答える
1

これを試してみてください

//.h
@property (weak, nonatomic) IBOutlet UIImageView *picImageStage;
//.m
NSString *userName = @"allen";
NSString *imgName = [NSString stringWithFormat:@"%@.png",userName];
UIImage *image = [UIImage imageNamed:imgName];
[self.picImageStage setImage:image];
于 2012-12-20T07:43:29.937 に答える