1

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

这是我目前在用户进行选择时拥有的代码:

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

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

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

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

谢谢!

4

2 回答 2

1

第二种方式完全没问题。该行为您提供了一个自动释放UIImage *image = [UIImage imageNamed: @"image1-big.png"];的变量。通过保留值的调用的 setter 方法image将其分配给您的 ivar 。因此,该行等效于更详细的方式。self.bigImage = imagebigImageself.bigImage = [UIImage imageNamed: @"image1-big.png"];

于 2012-07-31T22:02:15.520 回答
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!!
于 2012-07-31T22:06:57.973 回答