Quand mon UIViewController accède à un NSArray dans mon AppDelegate d'un IBAction il se bloque le programme

StackOverflow https://stackoverflow.com/questions/2803154

Question

J'ai quelques UIViewControllers que je suis en train d'accéder à un tableau dans mon AppDelegate. Lorsque j'utilise un IBAction UIButton et dans cette méthode que j'accéder à mon AppDelegate mon programme meurt en silence. Rien dans la production ou le débogueur, il arrête juste. Si je lance plusieurs fois, je vois qu'il ne parvient pas à accéder au tableau correctement.

Pour étudier ce problème, je créé une application très basique.

Dans mon AppDelegate.h je déclarais et définir les propriétés du tableau

#import <UIKit/UIKit.h>
@class MyViewController;
@interface MyAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    MyViewController *viewController;
    NSArray *images;
}
@property (nonatomic, retain) NSArray *images;
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet MyViewController *viewController;`

Dans le AppDelegate.m I synthétisé et initialisés le NSArray (également fait que les images ont été ajoutées au dossier des ressources).

@synthesize images;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    images = [NSArray arrayWithObjects:
        [[NSBundle mainBundle] pathForResource:@"bamboo_nw" ofType:@"jpg"],
        .....
        nil];
    NSLog(@"init images size:%i",[images count]); 
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];
    return YES;
}

Dans mon UIViewController.h j'ai ajouté la classe, le fichier d'en-tête importé, déclarai, et définir des propriétés pour mon pointeur AppDelegate.

#import <UIKit/UIKit.h>
#import "MyAppDelegate.h"
@class MyAppDelegate;
@interface MyViewController : UIViewController {

* MyAppDelegate mainDelegate;  IBOutlet UIButton mybutton;     }     @property (nonatomic, conserver) MyAppDelegate mainDelegate;     @property (nonatomic, conserver) UIButton * mybutton;     - (IBAction) faitOuelquechose; `

Dans mon UIViewController.m je synthétisent et céder mes AppDelegate. Je mis en place un IBAction qui se connectera le même nombre de NSArray du AppDelegate.

#import "MyViewController.h"
#import "MyAppDelegate.h"
@implementation MyViewController
@synthesize mybutton;
- (void)viewDidLoad {
    mainDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
    NSLog(@"vdl images size:%i",[mainDelegate.images count]);
    [super viewDidLoad];
}
-(IBAction) doSomething {

NSLog (@ "la taille des images ds:% i", [nombre mainDelegate.images]);     }

imprimer la taille du NSArray dans le AppDelegate quand je le crée, dans le ViewController quand je céder mes pointeur AppDelegate, puis à la suite de mon IBAction.

Je trouve que chaque fois que je clique sur le bouton du programme meurt. Le troisième fois que je clique sur le bouton, j'ai vu qu'il a couru mon IBAction mais imprimé ma taille de tableau comme 1 au lieu de 8. Est-ce que je manque quelque chose? Aussi, pourquoi ne pas obtenir des traces de pile ou quoi que ce soit, le débogueur meurt silencieusement?

Merci d'avance pour toute aide!

Sortie Debugger Console pour 3 pistes:

[Session started at 2010-05-10 06:21:32 -0700.]
2010-05-10 06:21:44.865 My[59695:207] init images size:8
2010-05-10 06:21:47.246 My[59695:207] vdl images size:8

[Session started at 2010-05-10 06:22:15 -0700.]
2010-05-10 06:22:18.920 My[59704:207] init images size:8
2010-05-10 06:22:19.043 My[59704:207] vdl images size:8

[Session started at 2010-05-10 06:22:23 -0700.]
2010-05-10 06:22:25.966 My[59707:207] init images size:8
2010-05-10 06:22:26.017 My[59707:207] vdl images size:8
2010-05-10 06:22:27.814 My[59707:207] ds images size:1
Était-ce utile?

La solution

Vous devez utiliser self.images comme lvalue dans application:DidFinishLaunchingWithOptions:, à savoir:

@synthesize images;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions(NSDictionary *)launchOptions {    
    self.images = [NSArray arrayWithObjects:
        [[NSBundle mainBundle] pathForResource:@"bamboo_nw" ofType:@"jpg"],
        .....
        nil];
    NSLog(@"init images size:%i",[images count]); 
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];
    return YES;
}

Lorsque vous utilisez le Ivar images sans self, vous perdriez la bonté de la rétention automatique que vous définissez lorsque vous avez créé le @property.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top