我对“匿名iOS内存”感到困惑

时间:2012-12-20 07:37:18

标签: iphone ios

我有三种编写此代码的方法。第三种方式使我困惑。

第一种方式正常。

//.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 个答案:

答案 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];