У меня есть пара UIViewControllers, которые я пытаюсь получить доступ к массиву внутри моего AppDelegate. Когда я использую IBAction UIButton и в этом методе я получаю доступ к своему AppDelegate, моя программа молча умирает. Ничего в выводе или отладчике, он просто останавливается. Если я запускаю его несколько раз, я вижу, что он не может правильно обращаться к массиву.
Чтобы исследовать эту проблему, я создал очень простое приложение.
В моем 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 (также убедился, что изображения были добавлены в папку ресурсов).
@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, retain) MyAppDelegate mainDelegate;
@property (nonatomic, retain) 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:% i", [mainDelegate.images count]);
} * * Тысяча двадцать-один
Я печатаю размер NSArray в AppDelegate при его создании, в ViewController, когда я сначала назначаю свой указатель AppDelegate, а затем в результате моего IBAction.
Я обнаружил, что каждый раз, когда я нажимаю кнопку, программа умирает. В третий раз, когда я нажал кнопку, я увидел, что он запускает мой IBAction, но напечатал размер моего массива как 1 вместо 8. Я что-то упустил? Кроме того, почему я не получаю следы стека или что-то еще, отладчик просто тихо умирает?
Заранее спасибо за любую помощь!
Выход консоли отладчика для 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