In answer to the question about whether there are other options (and not speaking to the point of whether one should do this).   One option is to make a class specifically as a place to keep variables that you need to have available globally.   One example from this blog post
@interface VariableStore : NSObject
{
    // Place any "global" variables here
}
// message from which our instance is obtained
+ (VariableStore *)sharedInstance;
@end
@implementation VariableStore
+ (VariableStore *)sharedInstance
{
    // the instance of this class is stored here
    static VariableStore *myInstance = nil;
    // check to see if an instance already exists
    if (nil == myInstance) {
        myInstance  = [[[self class] alloc] init];
        // initialize variables here
    }
    // return the instance of this class
    return myInstance;
}
@end
Then, from elsewhere:
[[VariableStore sharedInstance] variableName]
Of course, if you don't like the way they instantiate the singleton in the above example, you can choose your favorite pattern from here.   I like the dispatch_once pattern, myself.