在设置属性值时是否需要使用临时变量?

时间:2012-07-31 21:58:07

标签: objective-c ios

我有一个(保留的)UIImage属性,用于保存用户选择的图像。

这是我用户做出选择时的代码:

- (IBAction) selectImage1 {
    UIImage *image = [UIImage imageNamed: @"image1-big.png"];
    self.bigImage = image;
} 

但是我想知道是否可以省略临时变量便捷方法的使用并且只是这样做:

- (IBAction) selectImage1 {
    self.bigImage = [UIImage imageNamed: @"image1-big.png"];
} 

如果第二种方法存在问题(我猜测与内存管理有关),有人可以解释一下吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

第二种方式非常好。第UIImage *image = [UIImage imageNamed: @"image1-big.png"];行为您提供了自动发布的变量image。通过self.bigImage = image调用bigImage的setter方法将其分配给您的ivar,该方法保留该值。因此,行self.bigImage = [UIImage imageNamed: @"image1-big.png"];等同于更冗长的方式。

答案 1 :(得分:1)

您发布的两个片段之间的内存管理方面没有区别;除非你真正具体了解第一个片段中两行之间的保留计数。

在ARC环境中,局部变量将是一个“强”指针,但是当方法离开作用域时它会被释放。在第二个片段中,没有中间保留/释放指针,因此实际上可能稍微更高效。

我看到第一个片段技术的地方是必要的,当你有一个弱指针(即一个弱的@property)时,设置self.foo = [UIView ...会立即允许它被释放。在这些情况下,最好在使用它时使用局部变量来保持它:

UIView *someFoo = [UIView...
[self addSubview:someFoo];
self.someWeakProperty = someFoo;

与之比较:

self.someWeakProperty = [UIView...
[self addSubview:self.someWeakProperty]; // it's already nil!!