Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Are ints always initialized to 0?

Is it safe to count on ints always being initialized to 0 in Objective-C?

More specifically, when an object with int ivars has been newly instantiated, is it safe to assume that its ivars have value 0?

like image 532
Felixyz Avatar asked Jun 13 '09 14:06

Felixyz


People also ask

Are ints automatically initialized to 0?

Instance variables of numerical type (int, double, etc.) are automatically initialized to zero if you provide no other values; boolean variables are initialized to false; and char variables, to the Unicode character with code number zero.

Are ints automatically initialized to 0 C++?

Well, int's are value types in both c++ and C#, they use X bytes of ram, and all 0 bits, they are 0. So whether you initialize them or not, in memory they are still 0. Whether they are zero initialized or not depends on their storage type (static or automatic) and on how they are initialized.

What are ints initialized to?

No difference - int members are initialized to zero by default.

Is it necessary to initialize a variable with zero everytime?

Considering we say about C++ (now your question placed in the C++ section) compiler does not need variables be initialized to 0. But it do that automaticaly for arithmetic types defined in a global scope f.e. That also does not mean that someone need it.


1 Answers

Yes, class instance variables are always initialized to 0 (or nil, NULL, or false, depending on the exact data type). See the Objective-C 2.0 Programming Language:

The alloc method dynamically allocates memory for the new object’s instance variables and initializes them all to 0—all, that is, except the isa variable that connects the new instance to its class.


EDIT 2013-05-08
Apple seems to have removed the above document (now linked to The Wayback Machine). The (currently) active document Programming With Objective-C contains a similar citation:

The alloc method has one other important task, which is to clear out the memory allocated for the object’s properties by setting them to zero. This avoids the usual problem of memory containing garbage from whatever was stored before, but is not enough to initialize an object completely.


However, this is only true for instance variables of a class; it is also true for POD types declared at global scope:

// At global scope int a_global_var;  // guaranteed to be 0 NSString *a_global_string;  // guaranteed to be nil 

With one exception, it is not true for local variables, or for data allocated with malloc() or realloc(); it is true for calloc(), since calloc() explicitly zeros out the memory it allocates.

The one exception is that when Automatic Reference Counting (ARC) is enabled, stack pointers to Objective-C objects are implicitly initialized to nil; however, it's still good practice to explicitly initialize them to nil. From the Transitioning to to ARC Release Notes:

Stack Variables Are Initialized with nil

Using ARC, strong, weak, and autoreleasing stack variables are now implicitly initialized with nil

In C++ (and C++ objects being used in Objective-C++), class instance variables are also not zero-initialized. You must explicitly initialize them in your constructor(s).

like image 68
Adam Rosenfield Avatar answered Oct 15 '22 00:10

Adam Rosenfield