goto
. Today we're starting a new series examining variables in Objective-C. Our first topic in the series is global variables.Any variable declared outside of a function or method, class
@interface
or struct
declaration is a global variable:int count1; // global int main(int argc, char *argv[]) { int count2; // local to main() ... }Initialization: By default, global variables are initialized to zero. For regular pointer types (including regular C strings) this means
NULL
is the default value; for Objective-C object pointers, it's nil
by default. (This is different than local variables, which don't have a guaranteed initial value and thus should always be explicitly initialized.)A global variable can be assigned an initial value when defined, but there's a tricky restriction: the initial value must be something the compiler can calculate at compile time. In general, this means you can only use literal values like numbers, characters and string literals, and you can only use basic numeric operators. Here are some examples of global variables with legal initial values:
int count; // defaults to 0 int daysPerYear = 365; int secondsPerDay = 24 * 60 * 60;Unfortunately you can't call functions or methods or use other global variables when assigning initial values. Here are some examples of illegal initial values for global variables:
// WARNING: WON'T COMPILE // ERROR: function call not allowed size_t titleLength = strlen("Objective-C Tuesdays"); // ERROR: method call not allowed NSUInteger subtitleLength = [@"global variables" length]; // ERROR: calculation uses other global variables unsigned long totalLength = titleLength + subtitleLength;This restriction generally means that global Objective-C object types can't be initialized when they're declared:
// WARNING: WON'T COMPILE NSArray *array = [[NSArray alloc] initWithObjects:@"one", @"two", nil];There is one exception:
NSString
global variables can be initialized with Objective-C string literals (those special @
strings):NSString *title = @"Objective-C Tuesdays";If you need to do some complex initialization on your global variables, your only choice is to do it explicitly when your program starts. There are a few common places to do this sort of work:
- at the start of
main()
- in your application delegate's
-init
method - in your application delegate's
-applicationDidFinishLaunching:
method - in the
+initialize
method of one of your classes
+initialize
method for that class is a good way to keep related code grouped together. Otherwise, -applicationDidFinishLaunching:
is commonly used in Cocoa-touch programs while the start of main()
is the traditional place in C programs.Next time, we'll look at accessing global variables from multiple
.m
and .c
files.
No comments:
Post a Comment