Когда мой UIViewController обращается к Nsarray в моем AppDelegate от Ibaction, он сбивает программу

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

Вопрос

У меня есть пара 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 (нетомический, удерживающий) MyAppDelegate MainDelegate; @Property (неатомический, удерживающий) Uibutton * MyButton; - (ibaction) дошутного; `

В моем 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.

Я нахожу, что каждый раз, когда я ударил кнопку, программа умирает. В третий раз я ударил кнопку, я увидел, что он запустил мое ибцию, но напечатал свой размер массива как 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
Это было полезно?

Решение

Вам нужно использовать 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top