Iphone 释放对象,我理解正确吗?
我对ObjectC完全是新手,但我认为我的内存管理思想至少在根本上是正确的。我有一个简单的方法: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
-(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:
等方法也会返回需要释放的对象)。是的,但我试图保持简单,希望文档能够提供大量细节:)完全做到这一点。现在很清楚了。感谢你们两位。从技术上讲,主自动释放池在事件循环的顶部被释放,这可能意味着在池释放之前调用了几个方法。本地自动释放池在释放时会被释放,这些池也可能包含多条消息。从技术上讲,主自动释放池在事件循环的顶部被释放,这可能意味着在池释放之前会调用多个方法。本地自动释放池在被释放时被释放,这些池还可以包含多条消息。