views:

377

answers:

3

This code...

NSString * s = [[NSString alloc] initWithString:@"Hello, World"]; 
s = s.lowercaseString;
NSLog(@"%@", s);

...allows the use of dot notation but is strongly typed. This code...

id s = [[NSString alloc] initWithString:@"Hello, World"]; 
s = [s lowercaseString];
NSLog(@"%@", s);

... is weakly typed and requires use of square brackets.

Other than that, is there any advantage of using one over the other?

+4  A: 

Yes. The compiler warns you if you try to put a NSString into a method that expects a NSNumber.

It's more likely that the compiler finds your mistakes.

Georg
+11  A: 

If you're creating an NSString, then you might as well declare it as an NSString, and let the compiler help you.

The point of using id is to prevent strong coupling, and to use objects whose types are not known until a later time. e.g IBAction methods include the sender as a parameter as an id, because the exact type of the object isn't known.

Edited to add:

You may be new to the language, so I'll mention a couple of things

Firstly, where you have @"Hello, World", you already have an NSString, just one that is static. So you don't need to go through initWithString to create it. Just write:

NSString *s = @"Hello, World";

And, because you didn't alloc it, you don't have to worry about releasing it.

Secondly s.lowerCaseString. As Stephen has already answered, this is considered to be bad style. When you change a string to lower case, you aren't getting a property of the the string, you are causing an operation to be done on the string, in which case, you really should use bracket syntax.

Abizern
+4  A: 

Arguably the former code is incorrect. You should only really use the dot notation to get/set properties, and lowercaseString is a method.

Otherwise, as you suggest, the only real difference is type safety. If you had a typo, say you put [a loercaseString], the compiler wouldn't shout at you.

There are certainly cases where you'd use id but your example is not one of them

Stephen Darlington
Oh, sorry about the typo. I just wanted to correct the first method but just as I pressed "edit" I saw `loercase` and didn't read the context.
Georg
No worries. You don't normally expect people to deliberately write typos!
Stephen Darlington