我有Util课程如下。
@implementation Util
- (NSString*) getTodayString
{
NSDate *today = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
// display in 12HR/24HR (i.e. 11:25PM or 23:25) format according to User Settings
[dateFormatter setDateFormat:@"YYYY/MM/dd"];
NSString *now = [dateFormatter stringFromDate:today];
[dateFormatter release]; ///???
[today release]; //???
return now;
}
@end
我使用班级
- (void)awakeFromNib
{
Util *ut = [[Util alloc] init];
NSString* now = [ut getTodayString];
NSLog(@"User's current time in their preference format:%@",now);
[currentTime setObjectValue:now];
[now release]; ///???
[ut release];
}
释放物品时我很困惑。
在getTodayString ::
中Q1。 [dataFormatter发布]是必要的吗? Q2。 [今日发布]有必要吗?
我想我不需要释放它们,因为我没有分配自己。如果这是真的,那么这些对象何时被释放?
在awakeFromNib ::
中Q3。 [发布]是必要的吗? Q4。 [现在发布]是必要的吗?
我想我必须在显式创建对象时释放ut
,但不要对now
对象提起诉讼。
答案 0 :(得分:4)
Q1。 [dataFormatter发布]是 必要? Q2。 [今日发布]是 必要?
dataFormatter :是的,你分配/初始化它。
今天:不,它是从工厂方法返回的。
Q3。 [发布]是必要的吗? Q4。 [现在发布]是必要的吗?
同样,
ut :是的,你分配/初始化它。
现在:不,它是从工厂方法返回的。
如何确定何时是 对象被释放了?
在调用release
时发布,如果调用autorelease
,则会在下次运行自动释放池时调用release
。
如果我,也可以使用Objective-C 不关心他们?
不,不行。如果你没有自己清理,你将有大量的内存泄漏,在iOS环境中,这意味着你的应用程序完全关闭。在一个Mac应用程序,可能会导致大量的记忆,而不是一个好公民。这假设是非垃圾收集环境。即大多数。
我猜你的问题的核心是你不确定你何时负责调用release
以及当你得到一个autoreleased
对象时(或者更确切地说,当你负责呼叫时)释放对象)。按照惯例。如果您调用任何返回不包含单词的对象的方法:init / copy,则您无权调用release。如果你保留,你发布(可能还有一些规则要遵循,但在我看来,这是第一个真正开始理解这个规则的规则)。如果你曾经调用过alloc / init / copy,那么你必须在某个时候调用release
。
一位伟大的老师是Build&在Xcode中分析。这将很快指出你搞砸了什么,并真正帮助理解发生了什么。
答案 1 :(得分:1)
您是否关心objective-c中的内存管理取决于您使用的环境。如果您正在使用垃圾收集,则不必担心它,但默认情况下不会在mac上启用垃圾收集,并且在iOS上根本不可用。什么时候需要发布的基本规则:
当然,这些规则还依赖于遵循这些规则的任何第三方代码,以及它们自动释放返回的对象。
答案 2 :(得分:1)
memory management rules简单明了。不考虑保留计数,总是考虑所有权。当你问自己“我应该释放这个对象吗?”这个问题时,问问自己“我拥有它吗?”。将规则归于记忆,最终它们将成为第二天性。
遵守规则极为重要。如果忽略它们,那么您不拥有的对象可能会在完成之前被释放(例如,将您不拥有的对象分配给实例变量,它们可能会在自动释放池耗尽后被释放)。此外,如果你忽略它们,你最终会发生可怕的内存泄漏。