我有三种编写此代码的方法。第三种方式使我困惑。
//.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
答案 0 :(得分:5)
在第3段摘录中,您已将 @property声明为弱,并且UIImageView将立即 取消分配 。因为当与同一个对象没有强关系时,弱关系将是零。
在第一个代码段中,几乎相同,您首先将UIImageView分配给局部变量。此局部变量隐式使用强关系。如果您保留本地强变量的范围(即运行此代码的方法),则属性也将被释放,除非您在离开变量范围之前创建另一个强分配。例如,如果您将UIImageView添加为另一个视图的子视图,则会发生这种情况。将视图添加到另一个视图会产生强烈的关系。
答案 1 :(得分: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];
out to
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];
您不仅从您不拥有的变量中分配弱属性,只要调用赋值,您的变量就不会存储该值!这是因为,弱指针同样不会在他们的任务中调用隐式保留,这意味着你无法控制变量的持续时间,我愿意打赌它不会长时间存活!
答案 2 :(得分:2)
在这里,您使用weak
属性而不是retain
,并使用UIImage直接分配...
同样在第一阶段,当您将UIImageView分配给picImageStage
时,它的工作正常,因为它直接相等并存储在picImageStage
..这就是区别......
如果您使用
@property (retain, nonatomic) IBOutlet UIImageView *picImageStage;
而不是
@property (weak, nonatomic) IBOutlet UIImageView *picImageStage;
然后它的工作很好,因为这个原因..
答案 3 :(得分: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];