释放物体,我理解正确吗?

时间:2011-06-15 16:43:35

标签: iphone objective-c ios xcode4

我是Object C的完全新手,但我认为我对内存管理的想法至少从根本上是正确的。我有这个简单的方法:

-(int)weekIdFromDate:(NSDate *)inDate {

    NSCalendar *currentCal = [NSCalendar currentCalendar];
    NSDateComponents *component = [currentCal components:NSWeekCalendarUnit fromDate:inDate];
    int week = [component week];

    //I don't understand why this fails, it seems correct to release these objects now that they
    // are no longer needed
    [currentCal release];
    [component release];

    return week;
}

该方法存在于我的根视图控制器中,但警告位于“main”函数中。我用僵尸找到了“BAD_ACCESS ......”的原因。如果我对这些内容进行评论,那么一切正常,没有问题。

2 个答案:

答案 0 :(得分:3)

您正在发布您不拥有的对象。

用于获取currentCalcomponent autoreleased对象的方法,这些对象不是release的责任。

您只能使用new alloccopy或您发送retain消息的对象调用对象的发布。 (记住助记符NARC)。

所有内容都在Memory Management Guide

中解释

答案 1 :(得分:0)

您只能通过自己分配[[NSString alloc] init]或保留已存在的对象[thisVar retain]来释放您拥有的对象。释放它们只是告诉程序你不再需要它们。如果你自己分配它们并且没有任何其他任何所有权它们将从内存中释放,但如果其他东西仍然具有所有权并且没有调用发布方法,则在该对象调用发布之前它们将不会被释放。

但是对于您的程序,您依赖于自动释放。当你创建你的对象时,你不会分配或保留它们,因此当它们的NSAutoreleasePool被耗尽时它们会丢失(在方法的最后,除非你在另一个线程中),你不必担心它们更多。

基本上,由于您没有分配或保留它们,因此您无需释放它们。

希望这有帮助。