2012-01-08 5 views
0

В некотором классе AppDelegate я имею свойство NSDictionary *dict;Objective-C NSKeyedUnarchiver разгрузка

В applicationDidFinishLaunching я загружаю это нравится:

dict = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithFile: 
         @"/Users/username/Desktop/storage"]; 

Тогда у меня есть розетка для кнопки. Но внутри обработчика click-action я не смог получить доступ к элементам dict. Что я делаю не так?

EDIT: вот .h-файл:

#import <Cocoa/Cocoa.h> 

@interface tttAppDelegate : NSObject <NSApplicationDelegate> { 
    NSWindow *window; 
    NSDictionary *dict; 
} 

@property (assign) IBOutlet NSWindow *window; 
- (IBAction)click:(id)sender; 

@end 

и .й-файл:

#import "tttAppDelegate.h" 

@implementation tttAppDelegate 

@synthesize window; 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    dict = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithFile:@"/some/storage"]; 

    NSLog(@">>>>>>> %@", [dict valueForKey:@"test"]); // ok 
} 

- (IBAction)click:(id)sender { 
    NSLog(@">>>>>>> %@", [dict valueForKey:@"test"]); // fail 
} 
@end 
+0

Пожалуйста, размещайте больше кода. Является ли dict переменной экземпляра? –

+0

@AndrewMadsen сделано, спасибо – sashab

+0

Еще один вопрос: используете ли вы ARC (автоматический подсчет ссылок) или ручное управление памятью? –

ответ

1

Вы должны использовать аксессор недвижимости вместо прямого доступа к вашему переменному экземпляру:

В вашем файле .h:

@interface tttAppDelegate : NSObject <NSApplicationDelegate> { 
    NSWindow *window; 
    NSDictionary *dict; 
} 

@property (assign) IBOutlet NSWindow *window; 
@property (nonatomic, retain) NSDictionary *dict; 

- (IBAction)click:(id)sender; 

@end 

В вашем .m:

@implementation tttAppDelegate 

@synthesize window; 
@synthesize dict; 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    self.dict = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithFile:@"/some/storage"]; 

    NSLog(@">>>>>>> %@", [self.dict valueForKey:@"test"]); // ok 
} 

- (IBAction)click:(id)sender { 
    NSLog(@">>>>>>> %@", [self.dict valueForKey:@"test"]); // fail 
} 
@end 

Есть несколько причин сделать это, но наиболее важным в данном случае является то, что таким образом эти методы доступа может обрабатывать управление памятью переменной экземпляра.

Смежные вопросы