Où est défini votre délégué d'application et qui initialise ses propriétés window et viewController?

J'ai une question très novice concernant les applications IOS … Si je crée une nouvelle application basée sur la vue appelée TestForStackOverflow, Xcode crée automatiquement un code comme celui-ci pour le TestForStackOverflowAppDelegate.h:

@class TestForStackOverflowViewController; @interface TestForStackOverflowAppDelegate : NSObject <UIApplicationDelegate> @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet TestForStackOverflowViewController *viewController; @end 

et ce qui suit dans TestForStackOverflowAppDelegate.m:

 #import "TestForStackOverflowAppDelegate.h" #import "TestForStackOverflowViewController.h" @implementation TestForStackOverflowAppDelegate @synthesize window = _window; @synthesize viewController = _viewController; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; return YES; } [...] 

Voici mes questions:

1) où la class TestForStackOverflowAppDelegate est-elle définie en tant que délégué pour l'application en cours? Est-ce fait "automagiquement"? J'ai vu que le file source main.m ne contient que le code suivant:

 int main(int argc, char *argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal; } 

Ne devrait-il pas définir la class delegate de l'application dans le quasortingème paramètre de l'invocation de la fonction UIApplicationMain?

2) où sont placées les propriétés window et viewController de la class TestForStackOverflowAppDelegate?

3) cela peut être sortingvial, mais pourquoi avons-nous synthétiser window = _window, sans avoir une variable d'instance appelée _window dans l'interface TestForStackOverflowAppDelegate? J'ai vu que vous pouvez déclarer @properties sans avoir les iVars correspondants dans les interfaces de class (peut-être qu'ils sont créés automatiquement par le compilateur), mais est-ce une bonne pratique ou devriez-vous toujours créer les iVars correspondants dans vos classs?

Excusez-moi pour le très long message, j'espère juste que je n'ai pas écrit une question trop évidente car ici en Italie est tard dans la nuit et je suis très fatigué .. mais quand ces questions me viennent à l'esprit, je ne peux pas attendre la solution 🙂

Comment la class de délégué de l'application est-elle chargée?

Dans votre file -info.plist, il y a une key nommée "nom de base du file nib principal" et une vue similaire à MainWindow.xib. Dans ce file xib, il existe un object proxy propriétaire d'un file et un délégué est défini sur la class de délégué de l'application.

Ouvrez ce XIB dans le concepteur. Notez l'object propriétaire du file en haut, le context cliquez dessus et regardez l'object délégué. Maintenant, regardez les objects dans la design ci-dessous la ligne (XCode 4) – vous devriez voir l'object délégué de l'application là.

Où est la window et viewController pour l'set appDelegate?

Regardez dans le concepteur et le context, click l'object délégué de l'application sous la ligne (XCode 4). La window et la cible viewController y sont liées.

_window iVar

C'est automatiquement prévu pour vous. Pas clair pour moi si elle est héritée ou générée par le compilateur.

En savoir plus sur _ iVars: Pourquoi renommer les propriétés synthétisées dans iOS avec des traits de soulignement?

Si vous avez choisi de faire l'équivalent en code:

supprimer plist xib reference main.m: passer le nom du délégué

 int main(int argc, char *argv[]) { int retVal = UIApplicationMain(argc, argv, nil, @"HelloViewAppDelegate"); 

Dans le délégué de l'application:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. CGRect screenBounds = [[UIScreen mainScreen] applicationFrame]; CGRect windowBounds = screenBounds; windowBounds.origin.y = 0.0; // init window [self setWindow: [[UIWindow alloc] initWithFrame:screenBounds]]; // init view controller _mainViewController = [[MainViewController alloc] init]; [[self window] addSubview:[_mainViewController view]]; [self.window makeKeyAndVisible]; return YES; } 

1) Pour être simple, quand UIApplicationMain() est appelée,

  • votre application .plist est trouvée,
  • la key "Nom de la base de file principal nib" est recherchée,
  • ce XIB est ouvert,
  • L'object qui prend en charge le protocole UIApplicationDelegate est instancié et utilisé en tant que délégué d'application

2) Ils sont placés dans le XIB, vous pouvez les voir si vous

  • ouvre le XIB principal,
  • select l'object AppDelegate,
  • ouvrez l'inspecteur Connections pour cet object,
  • regarder dans la section Outlets

3) Vous avez raison, ils sont créés automatiquement par le compilateur. Il rend le code plus lisible en ayant less de ligne, et plus facile à refactoriser ayant seulement un endroit où la propriété est déclarée.

J'espère que cela aide!