views:

287

answers:

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

This is how I was taught to program in Objective C, yet the CLang error checker complains that the initial value was never read. But oFoo is an object with properties. oFoo itself has no single value. The property values are what matter.

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

Should I just ignore this? Is this worth fixing? What is the fix, seeing that "initial value" is meaningless in my context?

+2  A: 

Usually that means:

  1. You've created a variable.
  2. You've assigned some value to a variable. Doesn't matter, to itself or to it's properties.
  3. You've "recreated" this value or finished block (method/for-each/etc.).

For a simple type:

int a;
a = 2;
a = 3;

First value (2) is never used. Similar things can happen with objects, for example:

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

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

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

Here first alloc-init block created a value that was overridden by second alloc-init. And error tells something like that.

Instead of second alloc-init block I can close method implementation, that will be similar.

Alexander Babaev
A: 

I think Alexander Babaev may be right. Here's actual code:

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

aPart is an array of Part objects. Maybe I should eliminate the first line and the last line should look like this:

Part *oPart = [aParts objectAtIndex:iPart];

If I do that, I DO NOT have to explicitly release oPart at the end of the loop. By declaring oPart before the loop begins, I was trying to be efficient and just reuse the oPart object, rather than create/release each time through the loop.

Anybody know which is the better approach?

Scott Pendleton
In that case the first line should just be: Part *oPart = nil;, although the rest of code makes no sense to me - after the loop is done oPart will point to just the very last element in aParts. The same code would be to say: Part *oPart = [aParts lastElement];
Kendall Helmstetter Gelner