1

只是关于返回值的函数的最佳实践的一般问题。例如说我有以下功能(伪代码):不使用返回的函数值会影响内存吗?

- (UIImageView *)createImageViewAndAddWithImageName:(NSString *)sName 
{ 
    UIImageView *iv = nil; 

    if (sName) 
    { 
     UIImage *image = [UIImage imageNamed:sName]; 

     if (image) 
     { 
      iv = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; 
      [iv setImage:image]; 
      [iv setContentMode:UIViewContentModeScaleAspectFit]; 
      [self.view addSubview:iv]; 
     } 
    } 

    return iv; 
} 

现在,在某些情况下,我想执行类似下面进一步修改:

UIImageView *iv = [self createImageViewAndAddWithImageName:@"Blah"]; 
[iv setAlpha:0.5f]; 

哪里,其他时间我只想补充一个图像:

[self createImageViewAndAddWithImageName:@"Blah"]; 

在第二个例子中,我认为内存将被自动释放?在第二种情况下,如果在一个循环中运行它将使意义使用自动释放块象下面这样:

for (int i = 0; i < 100; i++) 
    { 
     @autoreleasepool { 
      [self createImageViewAndAddWithImageName:@"Blah"]; 
     } 
    } 

只是为了释放内存更快?在下面的主函数中有一个autorelease池是否会影响内存?

- (UIImageView *)createImageViewAndAddWithImageName:(NSString *)sName 
     { 
      UIImageView *iv = nil; 

@autoreleasepool { 
      if (sName) 
      { 
       UIImage *image = [UIImage imageNamed:sName]; 

       if (image) 
       { 
        iv = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; 
        [iv setImage:image]; 
        [iv setContentMode:UIViewContentModeScaleAspectFit]; 
        [self.view addSubview:iv]; 
       } 
      } 
} 
      return iv; 
     } 

我只是想确保不使用返回的值不会对我的应用程序产生负面影响,而且,过度使用自动释放池确实没有。

感谢您的任何建议。

回答

0

每次运行循环呼出时,它都会创建一个自动释放池。所以你所要做的就是在运行循环造成的任何事情时不要分配太多的内存。例如,如果用户按下按钮,则处理此操作的代码不应分配100 MB的内存,即使自动释放。否则,autoreleased是相当便宜。

+0

好的,非常感谢,我将在几个初始设置循环中测试自动释放池,以查看它是否对内存使用有重大影响。我猜自动释放池不能导致过度释放的对象?它只是作为一个较短的运行循环? –

相关问题