0
votes

In objective c, I often run into warnings in the compiler when I have methods that (for instance) return/take as an argument an NSInteger, and I instead place the argument as say a long int/NSNumber/etc value or variable. The code compiles fine, but I am always tempted to just do casts because the warnings make me uneasy. I understand that it probably does not make a big difference either way, but is casting the preferred way to handle these warnings or not?

2
First, do you understand that NSNumber is an object and the others are primitives and that casting between those categories doesn't make sense?jscs
Yep, you can get badly burned assigning/comparing between NSNumber and integer types. Sometimes there is no warning, but the statement is totally bogus. As to casting to/from NSinteger/NSUInteger and int/long, fire away, so long as you're confident you're not truncate any significant bits.Hot Licks
Eliminate all warnings! Then when a new one occurs it is readily apparent. If there are warnings then the code is not compiling fine. Also run Analyzer and fix any warnings there. The warnings are there for a reason.zaph
NSNumber *num = (NSNumber *)0x27; compiles and runs without crash/exception (for some version of SDK/OS). but you get unexpected result.Bryan Chen
You appear to have stumbled upon tagged pointers, @BryanChen.jscs

2 Answers

1
votes

int, NSInteger, and NSUInteger are scalars. NSNumber is an object. They have nothing to do with one another, and casting between them to hide that fact from the compiler will bring disaster.

Remember, casting means that you throw away the compiler's ability to check that you are doing the right thing. You can use casting to lie to the compiler, as if to say to it, "Don't worry, everything will be okay." Do not lie to the compiler! If you do, then when the app runs, you will get nonsense at worst, and a crash at best. (The crash is best, because it stops you dead; not crashing means you now have a big mistake that will be very difficult to track down later.)

1
votes

If the warning is just a cast issue then by all means add the cast. Many times Xcode is very helpful with this.

Many times the best answer is to change the declared type so there is neither an error nor a warning. Example: You have declared a variable as an int. A method is expecting a NSInteger. Instead of a cast change the declaration of the variable to an NSInteger.

But note that casting an NSNumber to an NSInteger for example will not fix anything, as @Josh points out they are very different things.

Eliminate all warnings! Then when a new one occurs it is readily apparent. If there are warnings then the code is not compiling fine.

Note: There are times when individual warnings will need to be eliminated with a #pragma but these are extremely rare and only done when the cause is completely understood. An example: I needed to be able to cause a crash in an application for testing, that code caused a warning, a #pragma was added to eliminated the warning.

Also run Analyzer and fix any warnings there.

The warnings are there for a reason, they help catch errors.