Quando meu UiviewController acessa um nsarray no meu appdelegate a partir de uma ibaction, ele trava o programa

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

Pergunta

Eu tenho alguns uiviewcontrollers que estou tentando acessar uma matriz dentro do meu appdelegate. Quando uso um ibaction uibutton e nesse método, acesse meu appdelegate, meu programa morre silenciosamente. Nada na saída ou no depurador, apenas para. Se eu executar várias vezes, posso ver que ele não está acessa a matriz corretamente.

Para investigar esse problema, criei um aplicativo muito básico.

No meu appdelegate.h declarei e defini propriedades para a 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;`

No AppDelegate.m, sintetizei e inicializei o NSARRAY (também certifiquei -se de que as imagens fossem adicionadas à pasta de 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;
}

Na minha classe uiviewController.h, adicionei a classe, o arquivo de cabeçalho importado, declarei e defina propriedades para o meu ponteiro appDelegate.

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

MyAppdelegate *mandelegate; Iboutlet uibutton MyButton; } @Property (não atômico, reter) MyAppdelegate Maindelegate; @Property (não atômico, reter) UIBUTTON *MyButton; -(ibaction) doSomething; `

No meu uiviewController.m sintetizo e atribuo meu appDelegate. Configurei uma ibação que registrará a mesma contagem do NSARRAY do 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 Imagens Tamanho:%i", [mandelegate.images contagem]); }

Imprimo o tamanho do NSARRAY no appDelegate quando o criar, no ViewController quando atribuo primeiro meu ponteiro appDelegate e, em seguida, como resultado da minha ibação.

Acho que toda vez que aperto o botão, o programa morre. Na terceira vez que apertei o botão, vi que ele corria minha ibação, mas imprimi o tamanho da minha matriz como 1 em vez de 8. Estou perdendo alguma coisa? Além disso, por que não tenho traços de pilha ou algo assim, o depurador morre silenciosamente?

Agradecemos antecipadamente por qualquer ajuda!

Saída do console do depurador para 3 execuções:

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

Solução

Você precisa usar self.images Como seu lvalue em 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;
}

Quando você usa o Ivar images sem o self, você está desistindo da bondade da retenção automática que você configurou quando criou o @property.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top