2010-05-10 2 views
0

У меня есть пара UIViewControllers, с которой я пытаюсь получить доступ к массиву внутри моего AppDelegate. Когда я использую IBAction UIButton, и в этом методе я получаю доступ к моему AppDelegate, моя программа умирает молча. Ничего на выходе или отладчика, он просто останавливается. Если я запускаю его несколько раз, я вижу, что он не имеет доступа к массиву должным образом.Когда мой UIViewController обращается к NSArray в моем AppDelegate из IBAction, он сбрасывает программу

Чтобы изучить эту проблему, я создал очень простое приложение.

В моей AppDelegate.h я объявил и установить свойство массива

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

В AppDelegate.m я синтезированный и инициализирован NSArray (также, что изображения были добавлены в папку Resources).

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

В моей UIViewController.h я добавил класс, импортированный файл заголовка, предрек и установить свойства для моего указателя AppDelegate.

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

MyAppDelegate * mainDelegate; IBOutlet UIButton mybutton; } @property (nonatomic, keep) MyAppDelegate mainDelegate; @property (неатомный, сохраняющий) UIButton * mybutton; - (IBAction) doSomething; `

В моем UIViewController.m Я синтезирую и присваиваю свой AppDelegate. Я установил IBAction, который будет регистрировать тот же счет NSArray из 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 images size:% i", [mainDelegate.images count]); }

Я печатаю размер NSArray в AppDelegate, когда я его создаю, в ViewController, когда я впервые назначил свой указатель AppDelegate, а затем в результате моего IBAction.

Я нахожу, что каждый раз, когда я нажимаю кнопку, программа умирает. В третий раз я нажал кнопку, я увидел, что он управлял моим IBAction, но напечатал мой размер массива как 1 вместо 8. Я что-то упустил? Кроме того, почему бы мне не получить трассировки стека или что-то еще, отладчик просто умирает молча?

Заранее благодарим за любую помощь!

Debugger Console выход 3 пробегов:

[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 

ответ

0

Вы должны использовать self.images в качестве Lvalue в application:DidFinishLaunchingWithOptions:, а именно:

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

При использовании Иварimages без self , вы отказываетесь от совершенства автоматического сохранения, которое вы создали, когда создали @property.

+0

Благодарим вас за то, что нашли время. Я знал, что я просто пропустил что-то очевидное! – JasonClark

+0

Мы живем для легких. – WineSoaked