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;

第二种方式工作正常。

//.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]; 

我不明白原因。有人可以帮我吗?感谢:D

4

4 回答 4

5

第三个片段中,您已将@property 声明为 weak,并且 UIImageView 将立即被释放。因为当同一个对象没有强关系时,弱关系将被归零。

在几乎相同的第一个片段中,您首先将 UIImageView 分配给了一个局部变量。此局部变量隐式使用强关系。如果您离开局部强变量的范围(即运行此代码的方法),该属性也将被释放,除非您在离开变量范围之前创建另一个强赋值。例如,如果您将 UIImageView 添加为另一个视图的子视图,则会发生这种情况。将视图添加到另一个视图会创建牢固的关系。

于 2012-12-20T07:44:42.207 回答
4

让我们检查所有三个,因为这可能是向您解释这一点的最简单方法。

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

Here you use weak property instead of retain and also alloc it directly with UIImage...

Also in first stage when you assign UIImageView to the picImageStage then its work fine because its directly equal and store in the picImageStage.. thats the difference..

if you use

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

instead of

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

then its work fine with this reason..

于 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 回答