I'm reading a book on Objective-C and the author said that if local variables aren't assigned a value they will be set to nil, but static variables will be set to zero. So, I set up int a
and didn't assign it a value. Then NSLog(@"%i", a)
to display it and a
was displayed as zero. I was a little confused on that and I was wondering if someone could clarify it for me?

- 3,235
- 7
- 43
- 76
-
12If the book said that as you've written it, I would recommend tossing it in the trash and finding a different book. Nil and 0 are effectively synonymous. Local variables (save for object references under ARC) will be undefined. Static and instance variables will be nil/zero/NULL/Nil, which are synonymous. – bbum Apr 05 '12 at 03:45
-
1Agreed with bbum; that's terrible. What the hell is this book? See also: http://stackoverflow.com/questions/9726817/can-variables-be-set-randomly-when-declaring-them-again/9726948#9726948 – jscs Apr 05 '12 at 06:44
2 Answers
With ARC enabled, your Objective-C object pointer variables will be set to nil regardless of where you create them.
Without ARC, and for built in C types, your variables will not be initialized.
Instance variables of Objective-C objects are always set to 0 (or nil) when you allocate an object.
Statics are set to 0.
I've gotten in the habit of always giving a default value to variables, though. It's been a good habit to have.

- 22,383
- 2
- 34
- 40
-
What about C types with ARC? What about if I have a BOOL when using ARC? Thanks! – Ricardo May 24 '14 at 11:00
-
1@Ricardo they should be handled according to C rules. Statics will be 0 and all others should be considered garbage. – wbyoung May 28 '14 at 20:19
-
Thanks. So, something like @property (nonatomic, assign) BOOL flag; is gargabe, isn't it? because is not staitc. However in my app I see it's 0 always. I don't have these rules very clear. – Ricardo Jun 02 '14 at 14:00
-
2@Ricardo the property is backed by an instance variable, not a local variable. So it falls into the instance variable rule and will be set to 0/FALSE/nil. – wbyoung Jun 03 '14 at 02:55
-
3For anyone looking for a source to this answer see Apple's document Transitioning to ARC Release Notes. Specifically the section titled Stack Variables Are Initialized with nil. https://developer.apple.com/library/content/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html – Pouria Almassi Mar 01 '18 at 00:52
No2. Just as in "plain" C, local variables are not assigned a default value. (Although you may get lucky the first time part of the stack is used: do not rely on this!.)
Anyway, nil
is 01 -- that is, nil == 0
is always true -- so NSLog("@%i", nil)
says "hey, log the argument as an integer", which is ... 0.
Happy coding.
1 See nil in gdb is not defined as 0x0? which covers the technical definition, including the Objective-C++ case, in more detail. Note that the type changes depending upon architecture as well so "@%i"
could very well be wrong for a particular system.
2 See wbyoung's answer for ARC-specific rules.

- 1
- 1
-
Does the same thing go for static variables? Since, the author said that assigning zero to static variables would be redundant because their default value is zero. – stumped Apr 05 '12 at 03:19
-
2
-
1