views:

719

answers:

4

Hi everyone, I've come across a problem related to pointers within arrays in objective-c.

What I'm trying to do is take the pointers within an NSArray, pass them to a method, and then assign the returned value back to the original pointer(the pointer which belongs to the array).

Based on what I know from C and C++, by dereferencing the pointers within the array, I should be able to change the values they point to... Here is the code I'm using, but it is not working (the value phone points to never changes based on the NSLog output).

NSArray *phoneNumbers = [phoneEmailDict objectForKey:@"phone"];
    for (NSString* phone in phoneNumbers) {
     (*phone) = (*[self removeNonNumbers:phone]);
     NSLog(@"phone:%@", phone);
    }

And here is the method signature I am passing the NSString* to:

- (NSString*) removeNonNumbers: (NSString*) string;

As you can see, I am iterating through each NSString* within phoneNumbers with the variable phone. I pass the phone to removeNonNumbers:, which returns the modified NSString*. I Then dereference the pointer returned from removeNonNumber and assign the value to phone.

As you can tell, I probably do not understand Objective-C objects that well. I'm pretty sure this would work in C++ or C, but I can't see why it doesn't work here! Thanks in advance for your help!

+2  A: 

NSArray is not a C/C++ style array. It's an Objective-C object. You need to use the instance methods of the NSArray class to perform operations on it.

In Objective-C you never "dereference" an object pointer to set its value.

Also, you're using what is called Fast Enumeration, which does not allow mutation.

Ben S
+6  A: 

Yeah, that's not going to work. You'll need an NSMutableArray:

NSMutableArray * phoneNumbers = [[phoneEmailDict objectForKey:@"phone"] mutableCopy];
for (NSUInteger i = 0; i < [phoneNumber count]; ++i) {
  NSString * phone = [phoneNumbers objectAtIndex:i];
  phone = [self removeNonNumbers:phone];
  [phoneNumbers replaceObjectAtIndex:i withObject:phone];
}
[phoneEmailDict setObject:phoneNumbers forKey:@"phone"];
[phoneNumbers release];
Dave DeLong
A: 

While this may work to some degree, I haven't tested it, I'd file this under 'bad idea' and not touch. NSArray, and many other cocoa objects, a fairly complex and can have a variety of implementations under the hood as part of the class cluster design pattern.

So when it comes down to it you really won't know what you're dealing internally. NSArray is actually designed to be immutable so in place editing is even doubly a bad idea.

Objects that are designed to let you mess around with the internals expose those through api methods like NSMutableData's mutableBytes.

You're better off constructing a new NS(Mutable)Array with the processed values.

Bryan McLemore
+4  A: 

You can't dereference Objective-C object variables. They are always pointers, but you should treat them as though they're atomic values. You need to mutate the array itself to contain the new objects you're generating.

Chuck