【问题标题】:IOS development, return function with if and else and autoreleaseIOS开发,if和else的return函数和autorelease
【发布时间】:2011-11-16 04:39:06
【问题描述】:

我正在使用我的第一个大型应用程序,但这里的内存管理有点问题。

-(id) dateFormatter:(id)date{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setTimeStyle:NSDateFormatterShortStyle];
    [dateFormatter setDateStyle:NSDateFormatterLongStyle];
    if([date isKindOfClass:[NSString class]])
        return [dateFormatter dateFromString:date];
     else
        return [dateFormatter stringFromDate:date];
}

现在,如我所见,此示例中的每个返回都需要在末尾自动释放。但是当我添加自动释放时,我得到一个 EXC_BAD_ACCESS 错误,没有它,一切都很好。我分析了问题,发现函数中的autorelease太多了,但是没有它我看不到如何释放NSDateFormatter的内存。

谁能解释一下?

【问题讨论】:

    标签: ios objective-c cocoa-touch memory-management


    【解决方案1】:

    怎么办:

    -(id) dateFormatter:(id)date{
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setTimeStyle:NSDateFormatterShortStyle];
        [dateFormatter setDateStyle:NSDateFormatterLongStyle];
    
        id retVal;
        if([date isKindOfClass:[NSString class]])
            retVal = [dateFormatter dateFromString:date];
         else
            retVal = [dateFormatter stringFromDate:date];
        [dateFormatter release];
        return retVal;
    
    }
    

    【讨论】:

    • 我当然可以,但不是我尝试过的方法吗?谢谢,这是显而易见的方式,如果这是这样做的方式,那么这就是我要做的:-)
    • 看起来好像您将autorelease 添加到了错误的对象。根据你的问题,我猜你在做:[[dateFormatter dateFromString:date] autorelease]; 你应该穿上它:[[[NSDateFormatter alloc] init] autorelease];
    【解决方案2】:

    为什么不使用自动释放?

    -(id) dateFormatter:(id)date{
        NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
        [dateFormatter setTimeStyle:NSDateFormatterShortStyle];
        [dateFormatter setDateStyle:NSDateFormatterLongStyle];
        if([date isKindOfClass:[NSString class]])
            return [dateFormatter dateFromString:date];
         else
            return [dateFormatter stringFromDate:date];
    }
    

    【讨论】:

      【解决方案3】:

      你也可以这样做:

      NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
      

      也有可能您在返回的变量返回时没有正确分配它。

      【讨论】:

        【解决方案4】:

        是的,有几个问题。首先是,您正在使用 dateFormatter 但您没有返回它。因此,当您初始化 dateFormatter 时,您需要对其调用 autorelease,或者您必须让 NSDateFormatter 为您提供一个 autoreleased 对象。

        例如:

        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init] autorelease];

        NSDateFormatter *dateFormatter = [NSDateFormatter dateFormatter];

        第二种方法不存在,但很高兴知道这些东西通常是如何工作的。无论如何,使用上面的第一种方法将修复您的代码。

        当您调用 [dateFormatter stringFromDate:date] 或 [dateFormatter dateFromString:date] 时,dateFormatter 将分别返回一个 NSString 或 NSDate。在这两种情况下,相应的方法 stringFromDate:date 或 dateFromString:date 都会为您创建一个自动释放的 NSString 或 NSDate 对象。

        然后您可以按原样返回任一对象,因为它已经自动释放。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-25
          • 2015-10-28
          • 2012-03-05
          • 1970-01-01
          相关资源
          最近更新 更多