2010-04-15 25 views
2
Foo *oFoo = [[[Foo alloc] init] autorelease]; 

这就是我被教导如何在Objective C中编程,但CLang错误检查器抱怨初始值从未读过。但oFoo是一个具有属性的对象。 oFoo本身没有单一的价值。属性值是重要的。CLang错误(目标C):初始化期间存储的值永远不会被读取

oFoo.PropertyA = 1; 
oFoo.PropertyB = @"Hello, World." 

我应该忽略这个吗?这值得修复吗?有什么解决办法,看到“初始价值”在我的语境中没有意义?

+2

当方法结束时,用oFoo做什么? – 2010-04-15 15:20:14

+0

如果您提供包含此方法的完整代码,那将会很不错。而且,顺便说一句,你是否尝试切换到其他编译器? – zakovyrya 2010-04-15 15:29:56

+0

oFoo当方法结束时自动释放。此代码示例足以说明问题。不,我不是编译器的修饰者。这对于我现在的位置来说太低级了。 – 2010-04-16 02:57:27

回答

9

通常,这意味着:

  1. 你已经创建了一个变量。
  2. 您已将某个值赋给变量。对自身或其属性无关紧要。
  3. 您已经“重新创建”了此值或完成的块(method/for-each/etc)。

对于一个简单的类型:

int a; 
a = 2; 
a = 3; 

第一值(2)从未使用过。例如:对象可能会发生类似的情况,例如:

Foo *oFoo = [[[Foo alloc] init] autorelease]; 

oFoo.PropertyA = 1; 
oFoo.PropertyB = @"Hello, World." 

oFoo = [[[Foo alloc] init] autorelease]; 

这里首先alloc-init块创建了一个被第二个alloc-init覆盖的值。而错误就是这样的。

而不是第二个alloc-init块我可以关闭方法实现,这将是类似的。

+0

非常好的答案 – 2015-12-31 12:22:55

0

我认为Alexander Babaev可能是对的。以下是实际代码:

Part *oPart = [[[Part alloc] init] autorelease]; 
iParts = aParts.count; 
for (iPart=0;iPart<iParts;iPart++) { 
    oPart = [aParts objectAtIndex:iPart]; 

aPart是Part对象的数组。也许我应该消除第一行和最后一行应该是这样的:

Part *oPart = [aParts objectAtIndex:iPart]; 

如果我这样做,我不必在循环的末尾明确释放oPart。通过在循环开始之前声明oPart,我试图提高效率并重用oPart对象,而不是每次通过循环创建/释放。

有人知道哪种方法更好?

+1

在这种情况下,第一行应该是:Part * oPart = nil;尽管剩下的代码对我没有意义 - 循环完成后,oPart将指向aParts中最后一个元素。相同的代码将会说:Part * oPart = [aParts lastElement]; – 2010-04-16 04:20:46

+0

在该循环中没有创建对象,它将'aParts'数组的预先存在的成员设置为ptr。您可能会将Objective-C与其他语言混淆:)并且我建议您重新研究一些Objective-C对象创建基础知识。另一个迹象表明,你之前的评论“oFoo在方法结束时自动释放”也是错误的。autorelease对象的生命周期并未链接到它们的作用域,但它们持续到池被耗尽为止,通常是在调用堆栈展开到应用程序的运行循环(即事件循环)时。这就是返回自动释放对象的原因。 – 2013-10-21 22:48:51

相关问题