Last week, I have met a very interested case, I don’t know that have you guys met this before, here is it:
Could you get the
NSLog result? In this case, it will show
It’s pretty weird result with some people. I was in that case. And after a while researching, that problem is not that simple. Further more, it drove me to a concept named Primitive type initialization – the one I’m gonna illustrate in this post with my little-stupid brain in coding (that’s true). T.T
As we all know,
BOOL is a primitive type of
Objective-C (for more further of
BOOL, you also can take a look at this valuable link). But first, let’s take a bit look at Object intitialization.
Objetive-C always initial object with pointer, that mean you don’t need to worry about initial value for an object. Really? Yes! We are all doing like this, for example, with NSString:
`NSString *string = [[NSString alloc] init];`
alloc did in the line above is allocate a chunk of memory to hold the object, then clear the memory, that means set it to
nil, this step will sure it will not be set by Garbage value. Thus, these values are guaranteed after the
alloc method is called.
Question is: What is Garbage value?
The Garbage value is not assigned, rather the value is already there. When you allocate a variable you are reserving a piece of memory - until you overwrite it that memory will contain whatever “random” information was there before.
init means you have an action to initialize precisely to avoid bugs in development, and finally return an object of type
id – the same object is being initialized.
So that means, all the object is safely initialization. Apple just did a good job let’s developers not take much time care about object initialization. So Object will be ignored from this post. All we are talking about is just Primitive type.
Additional: You recommendly should not use
[SomeObject new]; instead of
[[SomeObject alloc] init];, because new doesn’t support custom initializers, like
Primitive type initialization
We have 3 cases here with global, static and local variables, see example:
And result will be:
Global var : 0 Static var: 0 Local var :1606422582
So we can easily realize that local variables without initialization seem like unpredictable. Explaination for this,
global variables are initialized at
compile-time, since their address is known and fixed. Initializing them to
0 as default will not incur a
runtime cost. Other side,
automatic variables are stored in stack mean they don’t have fixed locations, they can have different addresses for different calls and would have to be initialized at
runtime each time the function is called, will incur a
runtime cost. If you don’t initialize them, they will be set to Garbage values that I mentioned above.
Apply for this case: The
localVar has value like
1606422582 because it has been taking a chunk of memory, which is maybe already store an value that has been there before, so
localVar has that value. Clear enough!
So what are we supposed to do?
Easy! With Primitive type variables, we just only need to initialize them to avoid exceptions, especially for local ones. This will make your code is clearer and under-control.
So hope this post could help you more in understanding about Primitive type initializations not only for
Objective-C but also for more languages in case you meet this problem. Please leave comments if you have unsure-thoughts or I wrote some mistakes.
Cheers and happy coding, and please share if you get this valuable.