عندما يصل UiviewController الخاص بي إلى nsarray في AppDelegate الخاص بي من ibacte ، فإنه يعطل البرنامج

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 I توليف وتهيئة 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 Uibultton Mybutton } property (غير الذري ، الاحتفاظ) myappdelegate maindelegate property (nonatomic ، الاحتفاظ) Uibultton *mybutton ؛ -(ibacte) dosomething ؛ ``

في uiviewController.m أنا أقوم بتوليف وتعيين appDelegate الخاص بي. قمت بإعداد iBacte الذي سيقوم بتسجيل نفس عدد 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 الخاص بي أولاً ، ثم نتيجة لـ Ibacte.

أجد أنه في كل مرة أضغط فيها على الزر يموت البرنامج. في المرة الثالثة التي ضغطت فيها على الزر ، رأيت أنه ركض ibacte الخاص بي ولكن طبع حجم الصفيف الخاص بي على أنه 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