2012-03-24 48 views
1

我知道这是相当基本的东西。如何释放我想要返回的值?

我有一个类的函数,返回月份的名称;我不知道如何发布我想返回的值以防止泄漏。

在类此值声明:

static NSDateFormatter *formatter = nil; 
if (formatter == nil) { 
    formatter = [[NSDateFormatter alloc] init]; 
    [formatter setDateFormat:@"MMMM yyyy"]; 
} 

事情发生,然后:

if([exampleDate isEqualToDate: 
    [[self creationDate] laterDate:exampleDate]]) 
{ //earlierDate returns the earlier date 
    return(@"Examples"); 
}else{ 
    return([formatter stringFromDate:[self creationDate]]); 
} 

我一直在使用自动释放尝试,但我不正确地使用它,因为我得到一个崩溃当我试图释放它。我也试着将返回值赋给一个字符串,但是我有相同的崩溃问题。对不起,我提出了一个非常重要的问题,但是我很想知道如何正确发布这个问题,同时还要回报价值 - 并理解它的工作原理。

+0

这肯定是什么自动释放用于制造。它在崩溃时如何使用autorelease? – 2012-03-24 10:46:44

+0

你有没有切换到ARC的具体原因?这个问题是无关紧要的:) – dasblinkenlight 2012-03-24 10:48:13

+0

对于这个例子批准formatter = [[[[NSDateFormatter alloc] init] autorelease]; – glenstorey 2012-03-24 10:48:32

回答

0

返回部分没有泄漏。由于stringFromDate:不是copy,mutableCopy,retain,allocnew它已经返回一个自动释放对象。

您的NSDateFormatter将在类重新分配时泄漏。如果你不想让它泄漏,你应该为它创建一个@property并在dealloc中释放它。
本地静态对象将始终泄漏。
我不会在单身人士以外使用这些物件。每次创建一个类时,都会泄露一个NSDateFormatter。几乎在每种情况下使用@property都更好。

我看到了这样的黑客但在我看来,他们解决了,你不应该摆在首位有一个问题:

- (NSString *)someDateFromString:(NSString *)str { 
    static NSDateFormatter *formatter = nil; 
    if (formatter == nil) { 
     formatter = [[NSDateFormatter alloc] init]; 
    } 
    if (str == nil) { 
     [formatter release]; 
     formatter = nil; 
     return nil; 
    } 
    // do something 
    return date; 
} 

- (void)dealloc { 
    [self someDateFromString:nil]; // will release the static date formatter. 
    [super dealloc]; 
} 
+0

格式化程序何时消失/释放?我的(理解有缺陷的)理解是,如果你分配你需要释放。 – glenstorey 2012-03-24 10:47:59

+0

如果你想释放它,不要为它创建一个静态变量。为它创建@property并在dealloc中释放它。 – 2012-03-24 10:51:08

+0

好吧,这是有道理的。该类还没有dealloc函数,因为我不需要它。我将添加@property和dealloc tmrw并让你知道我如何继续。 – glenstorey 2012-03-24 11:05:56