Quando il mio UIViewController accede ad un NSArray nel mio AppDelegate da un IBAction si blocca il programma

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

Domanda

Ho un paio di UIViewControllers che sto cercando di accedere a una matrice dentro il mio AppDelegate. Quando uso un'IBAction UIButton e in che modo posso accedere al mio AppDelegate miei programmi muore in silenzio. Nulla in uscita o il debugger, si ferma solo. Se l'eseguo più volte posso vedere che non riesce a accedere alla matrice correttamente.

Per indagare su questo problema ho creato un applicazione molto semplice.

Nel mio AppDelegate.h ho dichiarato e proprietà impostate per la matrice

#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;`

Nel AppDelegate.m ho sintetizzato e inizializzato il NSArray (anche fatto che le immagini sono state aggiunte alla cartella Risorse).

@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;
}

Nel mio UIViewController.h ho aggiunto classe, file di intestazione importato, dichiarati, e impostare le proprietà per il mio puntatore AppDelegate.

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

* MyAppDelegate mainDelegate;  IBOutlet UIButton myButton;     }     @property (nonatomic, mantenere) MyAppDelegate mainDelegate;     @property (nonatomic, trattenere) UIButton * mybutton;     - (IBAction) doSomething; `

Nel mio UIViewController.m ho sintetizzare e assegnare il mio AppDelegate. Ho creato un IBAction che registrerà lo stesso conteggio del NSArray dal 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 (@ "ds immagini formato:% i", [contano mainDelegate.images]);     }

I stampare la dimensione del NSArray nel AppDelegate quando creo che, nel ViewController quando ho assegnare il puntatore AppDelegate, e poi come risultato della mia IBAction.

trovo che ogni volta che mi ha colpito il pulsante di stampi di programma. Sulla terza volta mi ha colpito il pulsante, ho visto che si correva il mio IBAction ma stampato la mia dimensione della matrice come 1 invece di 8. Mi sto perdendo qualcosa? Inoltre, perché non posso ottenere tracce di stack o qualsiasi cosa, il debugger solo muore in silenzio?

Grazie in anticipo per qualsiasi aiuto!

uscita Debugger Console per 3 corse:

[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
È stato utile?

Soluzione

È necessario utilizzare self.images come valore assegnabile a application:DidFinishLaunchingWithOptions:, vale a dire:

@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;
}

Quando si utilizza il Ivar images senza la self, si stanno dando la bontà del mantenimento automatico che si configura quando è stato creato il @property.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top