Переменная делегата приложения iPhone не сохраняется - PullRequest
0 голосов
/ 30 июня 2010

У меня очень странная проблема с получением / сохранением переменной в моем делегате приложения iPhone (AppDelegate). Вначале я могу пройти и увидеть, что мои значения передаются в файл журнала (рассматриваемая переменная NSString), но когда файл журнала извлекается из другого класса (см. Код ниже), происходит сбой.

Вот мой файл AppDelegate.h:

   #import < UIKit/UIKit.h >

@interface AppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *_window;

 MainViewController *_mainViewController;
 NSString *logFile;
}

@property (nonatomic, retain) NSString *logFile;
@property (nonatomic, retain) ProductClass *item;
@property (nonatomic, retain) UIWindow *window;

-(void)appendToLog:(NSString *)textToLog;
@end

Вот мой AppDelegate.m:

#import "AppDelegate.h"
#import "MainViewController.h"

@implementation AppDelegate

@synthesize window = _window;
@synthesize logFile;

- (void) applicationDidFinishLaunching:(UIApplication *)application {    
 _window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

 _mainViewController = [[MainViewController alloc] init];
 UINavigationController *_navigationController = [[UINavigationController alloc] initWithRootViewController:_mainViewController];

 //Initialize the product class
     [self appendToLog:@"Application loaded"];

     [_window addSubview:_navigationController.view];
     [_window makeKeyAndVisible];
}

-(void)appendToLog:(NSString *)textToLog {
 //Append the log string
 if(logFile!=nil) {
  NSString *tmp = [[logFile stringByAppendingString:textToLog] stringByAppendingString:@"\n"];
  logFile = tmp;
 }
 else {
  NSString *tmp = [textToLog stringByAppendingString:@"\n"];
  logFile = tmp;
 }
}

@end

Когда я использую вызов (из другого класса):

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSString *s = [appDelegate logFile];

«logfile» возвращается как «вне области видимости», поэтому локальная переменная «s» выглядит как «месиво».

Что я здесь не так делаю? Это не имеет смысла для меня.

Ответы [ 3 ]

3 голосов
/ 30 июня 2010

Вы должны заменить logFile = tmp; на self.logFile = tmp;, потому что вам нужно использовать «я». префикс при назначении ivar, чтобы код вызывал правильный метод settor. На самом деле, вы просто назначаете ivar экземпляру объекта с автоматическим освобождением, а не сохраняете его. «Я». префикс гарантирует, что код делает правильные вещи. Без этого вы просто присваиваете переменную, не сохраняя ее.

0 голосов
/ 30 июня 2010

Я бы порекомендовал префикс logfile с self в ваших операторах присваивания в AppDelegate.Например, self.logfile = ...

0 голосов
/ 30 июня 2010

Из ссылки на класс UIApplication - UIApplication назначает и не сохраняет делегата.Сначала вам нужно инициализировать ваш экземпляр AppDelegate.

...