2010-08-11 6 views

Répondre

3

les maintenir dans le délégué de l'application est une solution, mais il est pas particulièrement élégant pour fourrer tout dans une classe dont le but est vraiment de répondre à des événements liés à l'application. Pour les constantes, vous pouvez simplement créer des fichiers d'en-tête et utiliser #define ou const, puis inclure les fichiers d'en-tête partout où vous avez besoin des constantes.

Pour les variables globales, vous pouvez créer un singleton class avec des variables static. Il y a beaucoup de macros qui peuvent synthétiser des singletons pour les cours. Voici un exemple de la boîte à outils Google pour Mac:

// 
// GTMObjectSingleton.h 
// Macro to implement methods for a singleton 
// 
// Copyright 2005-2008 Google Inc. 
// 
// Licensed under the Apache License, Version 2.0 (the "License"); you may not 
// use this file except in compliance with the License. You may obtain a copy 
// of the License at 
// 
// http://www.apache.org/licenses/LICENSE-2.0 
// 
// Unless required by applicable law or agreed to in writing, software 
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 
// License for the specific language governing permissions and limitations under 
// the License. 
// 

#define _GTMDevAssert(condition, ...)          \ 
do {                  \ 
if (!(condition)) {              \ 
[[NSAssertionHandler currentHandler]         \ 
handleFailureInFunction:[NSString stringWithUTF8String:__PRETTY_FUNCTION__] \ 
file:[NSString stringWithUTF8String:__FILE__] \ 
lineNumber:__LINE__         \ 
description:__VA_ARGS__];        \ 
}                  \ 
} while(0) 


/// This macro implements the various methods needed to make a safe singleton. 
// 
/// This Singleton pattern was taken from: 
/// http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/chapter_3_section_10.html 
/// 
/// Sample usage: 
/// 
/// GTMOBJECT_SINGLETON_BOILERPLATE(SomeUsefulManager, sharedSomeUsefulManager) 
/// (with no trailing semicolon) 
/// 
#define GTMOBJECT_SINGLETON_BOILERPLATE(_object_name_, _shared_obj_name_) \ 
static _object_name_ *z##_shared_obj_name_ = nil; \ 
+ (_object_name_ *)_shared_obj_name_ {    \ 
@synchronized(self) {       \ 
if (z##_shared_obj_name_ == nil) {    \ 
/* Note that 'self' may not be the same as _object_name_ */        \ 
/* first assignment done in allocWithZone but we must reassign in case init fails */  \ 
z##_shared_obj_name_ = [[self alloc] init];            \ 
_GTMDevAssert((z##_shared_obj_name_ != nil), @"didn't catch singleton allocation");  \ 
}            \ 
}            \ 
return z##_shared_obj_name_;      \ 
}             \ 
+ (id)allocWithZone:(NSZone *)zone {    \ 
@synchronized(self) {       \ 
if (z##_shared_obj_name_ == nil) {    \ 
z##_shared_obj_name_ = [super allocWithZone:zone]; \ 
return z##_shared_obj_name_;     \ 
}            \ 
}            \ 
\ 
/* We can't return the shared instance, because it's been init'd */ \ 
_GTMDevAssert(NO, @"use the singleton API, not alloc+init");  \ 
return nil;          \ 
}             \ 
- (id)retain {          \ 
return self;          \ 
}             \ 
- (NSUInteger)retainCount {      \ 
return NSUIntegerMax;       \ 
}             \ 
- (void)release {         \ 
}             \ 
- (id)autorelease {        \ 
return self;          \ 
}             \ 
- (id)copyWithZone:(NSZone *)zone {    \ 
return self;          \ 
} 
2

Si vous aimez la variété, voici un autre, celui-ci de CocoaWithLove - il parle pourquoi vars mondiale devrait vous faire peur here; probablement une bonne lecture.

// 
// SynthesizeSingleton.h 
// CocoaWithLove 
// 
// Created by Matt Gallagher on 20/10/08. 
// Copyright 2008 Matt Gallagher. All rights reserved. 
// 
// Permission is given to use this source code file, free of charge, in any 
// project, commercial or otherwise, entirely at your risk, with the condition 
// that any redistribution (in part or whole) of source code must retain 
// this copyright and permission notice. Attribution in compiled projects is 
// appreciated but not required. 
// 

#define SYNTHESIZE_SINGLETON_FOR_CLASS(classname) \ 
\ 
static classname *shared##classname = nil; \ 
\ 
+ (classname *)shared##classname \ 
{ \ 
    @synchronized(self) \ 
    { \ 
     if (shared##classname == nil) \ 
     { \ 
      shared##classname = [[self alloc] init]; \ 
     } \ 
    } \ 
    \ 
    return shared##classname; \ 
} \ 
\ 
+ (id)allocWithZone:(NSZone *)zone \ 
{ \ 
    @synchronized(self) \ 
    { \ 
     if (shared##classname == nil) \ 
     { \ 
      shared##classname = [super allocWithZone:zone]; \ 
      return shared##classname; \ 
     } \ 
    } \ 
    \ 
    return nil; \ 
} \ 
\ 
- (id)copyWithZone:(NSZone *)zone \ 
{ \ 
    return self; \ 
} \ 
\ 
- (id)retain \ 
{ \ 
    return self; \ 
} \ 
\ 
- (NSUInteger)retainCount \ 
{ \ 
    return NSUIntegerMax; \ 
} \ 
\ 
- (void)release \ 
{ \ 
} \ 
\ 
- (id)autorelease \ 
{ \ 
    return self; \ 
} 
0

Habituellement, je crée un fichier d'en-tête Resources.h et y conserve toute ma définition. L'utilisation d'une variable statique est également une bonne idée.

+0

et comment définir des constantes là? comme ça? #define MY_CONST @ "ma constante" – Burjua

Questions connexes