Calling a method on an uninitialized object (null pointer)
One thing you should be clear on is that in Objective-C, you don't call a method on an object, you send a message to an object. The runtime will find the method and call it.
Since the first versions of Objective-C, a message to nil has always been a safe no-op that returns nil. There's a lot of code that depends on this behavior.
From Greg Parker's site:
If running LLVM Compiler 3.0 (Xcode 4.2) or later
Messages to nil with return type | return Integers up to 64 bits | 0 Floating-point up to long double | 0.0 Pointers | nil Structs | {0} Any _Complex type | {0, 0}
A message sent to a nil
object is perfectly acceptable in Objective-C, it's treated as a no-op. There is no way to flag it as an error because it's not an error, in fact it can be a very useful feature of the language.
From the docs:
Sending Messages to nil
In Objective-C, it is valid to send a message to nil—it simply has no effect at runtime. There are several patterns in Cocoa that take advantage of this fact. The value returned from a message to nil may also be valid:
If the method returns an object, then a message sent to
nil
returns0
(nil
), for example:
Person *motherInLaw = [[aPerson spouse] mother];
If
aPerson
’sspouse
isnil
, thenmother
is sent tonil
and the method returnsnil
.If the method returns any pointer type, any integer scalar of size less than or equal to
sizeof(void*)
, afloat
, adouble
, along double
, or along long
, then a message sent tonil
returns0
.If the method returns a
struct
, as defined by the Mac OS X ABI Function Call Guide to be returned in registers, then a message sent tonil
returns0.0
for every field in the data structure. Otherstruct
data types will not be filled with zeros.If the method returns anything other than the aforementioned value types the return value of a message sent to nil is undefined.