Cuando mi UIViewController accede a una NSArray en mi AppDelegate de un IBAction se bloquea el programa

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

Pregunta

Tengo un par UIViewControllers que estoy tratando de acceder a una gran variedad dentro de mi AppDelegate. Cuando uso una UIButton IBAction y en ese método de ingreso a mi AppDelegate mis matrices programa en silencio. Nada en la producción o el depurador, que sólo se detiene. Si lo ejecuto varias veces, puedo ver que está fallando a acceder a la matriz correctamente.

Para investigar este problema he creado una aplicación muy básica.

En mi AppDelegate.h I declaró y propiedades de deformación de la matriz

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

En el AppDelegate.m que sintetiza y se inicializa el NSArray (también se aseguró se añadieron las imágenes en la carpeta Recursos).

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

En mi UIViewController.h añadí clase, archivo de cabecera importado, declaradas y las propiedades establecidas para mi puntero AppDelegate.

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

* MyAppDelegate mainDelegate;  IBOutlet UIButton myButton;     }     @property (no atómica, retener) MyAppDelegate mainDelegate;     @property (no atómica, retener) UIButton * myButton;     - (IBAction) doSomething; `

En mi UIViewController.m sintetizo y asignar mi AppDelegate. Establecí una IBAction que ingrese el mismo número de la NSArray del 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 imágenes tamaño:% i", [cuentan mainDelegate.images]);     }

Me imprimir el tamaño de la NSArray en el AppDelegate cuando creo que, en el ViewController cuando por primera vez asigno mi puntero AppDelegate, y luego, como resultado de mi IBAction.

Me parece que cada vez que me golpeó el botón de las matrices del programa. En la tercera vez que me golpeó el botón, vi que corría mi IBAction pero impreso mi tamaño de la matriz como 1 en lugar de 8. Me estoy perdiendo algo? Además, ¿por qué no puedo obtener seguimientos de pila o nada, el depurador simplemente muere en silencio?

Gracias de antemano por cualquier ayuda!

salida de un depurador de consola para 3 carreras:

[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
¿Fue útil?

Solución

Es necesario utilizar self.images como su valor-I en application:DidFinishLaunchingWithOptions:, a saber:

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

Cuando se utiliza el Ivar images sin la self, está renunciando a la bondad de la retención automática que se configura cuando se creó el @property.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top