Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 释放对象,我理解正确吗?_Iphone_Objective C_Ios_Xcode4 - Fatal编程技术网

Iphone 释放对象,我理解正确吗?

Iphone 释放对象,我理解正确吗?,iphone,objective-c,ios,xcode4,Iphone,Objective C,Ios,Xcode4,我对ObjectC完全是新手,但我认为我的内存管理思想至少在根本上是正确的。我有一个简单的方法: -(int)weekIdFromDate:(NSDate *)inDate { NSCalendar *currentCal = [NSCalendar currentCalendar]; NSDateComponents *component = [currentCal components:NSWeekCalendarUnit fromDate:inDate]; int

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

-(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”函数中。我用一个僵尸来定位“坏访问…”的原因。如果我对这些发布进行注释,则所有操作都可以正常进行,不会出现任何问题。

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

获取
currentCal
component
返回
autoreleased
对象所使用的方法,这些对象不是您的责任
发布

仅对通过
new
alloc
copy
获得的对象或发送
retain
消息的对象调用release。(记住助记符NARC)


所有这些都在

中解释,您正在释放您不拥有的对象

获取
currentCal
component
返回
autoreleased
对象所使用的方法,这些对象不是您的责任
发布

仅对通过
new
alloc
copy
获得的对象或发送
retain
消息的对象调用release。(记住助记符NARC)


所有这些都在

中进行了解释,您只能释放您拥有的对象,可以通过自己分配它们
[[NSString alloc]init]
或保留已经存在的对象
[thisVar retain]
。释放它们只是告诉程序你不再需要它们。如果您自己分配了它们,并且没有任何其他对象具有任何所有权,那么它们将从内存中释放,但是如果其他对象仍然具有所有权并且没有调用release方法,那么它们将不会被释放,直到该对象调用release

然而,对于您的程序,您依赖于自动释放。当您创建对象时,您不分配或保留它们,因此当它们的NSAutoreleasePool耗尽时(在方法末尾,除非您在另一个线程中),它们将丢失,您不必再担心它们

基本上,因为您没有分配或保留它们,所以您不必释放它们


希望这能有所帮助。

您只能释放您拥有的对象,方法是自己分配
[[NSString alloc]init]
或者保留已经存在的对象
[thisVar retain]
。释放它们只是告诉程序你不再需要它们。如果您自己分配了它们,并且没有任何其他对象具有任何所有权,那么它们将从内存中释放,但是如果其他对象仍然具有所有权并且没有调用release方法,那么它们将不会被释放,直到该对象调用release

然而,对于您的程序,您依赖于自动释放。当您创建对象时,您不分配或保留它们,因此当它们的NSAutoreleasePool耗尽时(在方法末尾,除非您在另一个线程中),它们将丢失,您不必再担心它们

基本上,因为您没有分配或保留它们,所以您不必释放它们


希望这有帮助。

从技术上讲,它是包含这些术语的方法(即
mutableCopy
allocWithZone:
等方法也会返回您需要释放的对象)。是的-但我试图保持它的简单性,并希望文档能够提供大量细节:)完全做到这一点。现在很清楚了。谢谢你们,两位。从技术上讲,这是包含这些术语的方法(例如
mutableCopy
allocWithZone:
等方法也会返回需要释放的对象)。是的,但我试图保持简单,希望文档能够提供大量细节:)完全做到这一点。现在很清楚了。感谢你们两位。从技术上讲,主自动释放池在事件循环的顶部被释放,这可能意味着在池释放之前调用了几个方法。本地自动释放池在释放时会被释放,这些池也可能包含多条消息。从技术上讲,主自动释放池在事件循环的顶部被释放,这可能意味着在池释放之前会调用多个方法。本地自动释放池在被释放时被释放,这些池还可以包含多条消息。