【发布时间】:2011-01-24 07:41:27
【问题描述】:
假设我做了以下事情(foo 从某个对象开始):
[foo release];
// STUFF with foo
[foo retain];
只要我不重新分配 foo,在这结束时我仍然会拥有相同的 foo,对吗?在 //STUFF 期间我不会冒失去 foo 的风险,是吗?
我想我是在确保我对发布的理解是正确的。如果我释放 foo,它实际上不会消失,直到它的所有句柄都消失了。换句话说,foo 必须被分配给 //STUFF 中的某个其他对象,或者 foo 必须超出 //STUFF 中的范围(并且可能创建了一个新的 foo)才能获得实际的原始 foo要删除的对象,对吗?
编辑动机:
我想这样做的原因是,假设我有以下 switch 语句:
switch (test)
{
case 1:
foo = [A alloc];
[foo inita];
break;
case 2:
foo = [B alloc];
[foo initb];
break;
case 3:
[foo setupc];
break;
case 4:
f = [D alloc];
[foo initd];
break;
}
在切换之前释放 foo 并在结束时保留它是有意义的。除了案例 3。所以,我在想如果可以安全地执行我建议的操作,它可能会使代码更简单。
当然,我可以在每个 alloc/init 周围放置一个释放/保留对,但这是很多重复的代码......
一个 [foo autorelease] 然后保留可能就可以解决问题。
【问题讨论】:
-
如果您能在此处提供更多上下文,将会有所帮助。 foo 是一个实例变量吗?您是否假设 foo 在切换之前已经包含一个对象? (否则,为什么需要调用 -release?)此外,alloc 返回一个保留计数为 1 的实例。为什么需要额外调用来保留?我完全不清楚你在这里要做什么。
-
测试的性质是什么?根据答案,可能会用多态行为替换开关。
-
@JLehr,test 是一个基于 mimetype 的 int。不同的类型是不同类型的文档... foo 是一个实例变量,它可能已经包含一个对象。 (因此发布)在案例 3 的实际代码中,有一个“if (foo==nil) foo = [C alloc];”在第 3 种情况下...我不确定是否需要保留。我想我的问题比我想象的要大......
标签: objective-c release retain