首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动释放带ARC的池和池排出

自动释放带ARC的池和池排出
EN

Stack Overflow用户
提问于 2013-04-16 03:52:37
回答 5查看 2.5K关注 0票数 0

我想用ARC迁移这段代码。

我知道我必须使用:

代码语言:javascript
复制
@autoreleasepool {}

但是我的两个游泳池的排水口出了点问题,我不知道该怎么办。

代码语言:javascript
复制
- (void)downloadImageToCache:(NSString*)_urlImage
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    if (!(_urlImage) || (_urlImage == nil)) 
    {
        [pool drain];
        return;
    }

    NSURL *url = [NSURL URLWithString:_urlImage];
    NSData *data = [[[NSData alloc] initWithContentsOfURL:url] autorelease];

    if (data != nil) 
    {
        ...do something...
    }
    else
    {

        ...do something...
    }
    [pool drain];
}
EN

回答 5

Stack Overflow用户

发布于 2013-04-16 04:00:45

把整个东西都包起来。不要担心回报问题。它会解决这个问题的。

也就是说,编译器会把它转换成逻辑上等价的:(或者你也可以显式地清理逻辑)

代码语言:javascript
复制
- (void)downloadImageToCache:(NSString*)_urlImage
{
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  if (!(_urlImage) || (_urlImage == nil))
  {
    //[pool drain];
    //return;
  } else {

    NSURL *url = [NSURL URLWithString:_urlImage];
    NSData *data = [[[NSData alloc] initWithContentsOfURL:url] autorelease];

    if (data != nil)
    {
      ...do something...
    }
    else
    {  
      ...do something...
    }
  }
  [pool drain];
}

这将简化为:

代码语言:javascript
复制
- (void)downloadImageToCache:(NSString*)_urlImage {
  @autoreleasepool {
    if (_urlImage != nil) {

      NSURL *url = [NSURL URLWithString:_urlImage];
      NSData *data = [[[NSData alloc] initWithContentsOfURL:url] autorelease];

      if (data != nil) {
        // ...do something...
      } else {
        //...do something...
      }
    }
  }
}

或者(更少的嵌套缩进始终是我的偏好):

代码语言:javascript
复制
- (void)downloadImageToCache:(NSString*)_urlImage {
  if (_urlImage == nil) {
    NSLog(@"[%@ %@] Error Message", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
    return;
  }

  @autoreleasepool {

    NSURL *url = [NSURL URLWithString:_urlImage];
    NSData *data = [[[NSData alloc] initWithContentsOfURL:url] autorelease];

    if (data != nil) {
      // ...do something...
    } else {
      //...do something...
    }
  }
}
票数 2
EN

Stack Overflow用户

发布于 2013-04-16 03:59:18

您可以从自动释放池中“提前返回”,这将释放池中的所有对象:

代码语言:javascript
复制
- (void)downloadImageToCache:(NSString*)_urlImage
{
    @autoreleasepool {    
       if (!(_urlImage) || (_urlImage == nil)) 
       {
           // no need (not allowed) to call `drain`
           return;
       }

       NSURL *url = [NSURL URLWithString:_urlImage];
       NSData *data = [[[NSData alloc] initWithContentsOfURL:url] autorelease];

       if (data != nil) 
       {
           ...do something...
       }
       else
       {

           ...do something...
       }
       // no need (not allowed) to call `drain`
    }
}
票数 1
EN

Stack Overflow用户

发布于 2013-04-16 03:59:52

使用新的@autorelease块语法,当执行退出块时,池将被排空。所以你可以这样做:

代码语言:javascript
复制
- (void)downloadImageToCache:(NSString*)_urlImage
{
    @autoreleasepool {

        if (!(_urlImage) || (_urlImage == nil)) 
        {
            return; //leaves @autoreleasepool block, automatically drains
        }

        NSURL *url = [NSURL URLWithString:_urlImage];
        NSData *data = [[[NSData alloc] initWithContentsOfURL:url] autorelease];

        if (data != nil) 
        {
            ...do something...
        }
        else
        {

            ...do something...
        }
    } //leaves @autoreleasepool block, automatically drains
}

有关更多信息,请参阅AutoreleasePools

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16023657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档