0

AppDelegate 内の配列にアクセスしようとしている UIViewControllers がいくつかあります。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 を合成して初期化しました (画像が 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 (非アトミック、保持) MyAppDelegate mainDelegate; @property (非アトミック、保持) UIButton *mybutton; -(IBAction) doSomething;`

UIViewController.m で、AppDelegate を合成して割り当てます。AppDelegate から NSArray の同じカウントをログに記録する IBAction をセットアップしました。

#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 に出力し、最初に AppDelegate ポインターを割り当てたときに ViewController に出力し、次に IBAction の結果として出力します。

ボタンを押すたびに、プログラムが停止することがわかりました。3 回目にボタンを押すと、IBAction が実行されましたが、配列サイズが 8 ではなく 1 として出力されました。また、スタック トレースなどを取得しないのはなぜですか。デバッガーは黙って終了します。

助けてくれてありがとう!

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
4

1 に答える 1

0

self.imagesの左辺値として使用する必要があります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;
}

を使用せずにivar を使用すると、を作成したときに設定した自動保持の良さを放棄することになります。imagesself@property

于 2010-05-10T14:15:10.563 に答える