iPhone-Anwendung Delegate-Variable nicht zurückgehalten
-
01-10-2019 - |
Frage
Ich habe eine sehr seltsame Frage retrieving / Halte eine Variable in meiner iPhone-Anwendung delegiert (AppDelegate). Zunächst kann ich Schritt für Schritt durch und sehe, dass meine Werte Logfile übergeben werden (die NSString Variable in Frage), aber wenn Logfile von einer anderen Klasse abgerufen wird (siehe Code unten), es Störungen.
Hier ist meine AppDelegate.h-Datei:
#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
Hier ist mein 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
Wenn ich den Anruf verwenden (von einer anderen Klasse):
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSString *s = [appDelegate logFile];
"Logfile" kommt zurück als "out of scope", so die lokale Variable "s" Matsch ist.
Was mache ich hier falsch? Es ist nicht Sinn für mich zu machen.
Lösung
Sie sollten logFile = tmp;
mit self.logFile = tmp;
ersetzen, weil Sie die verwenden müssen „Selbst“. wenn ein Präfix Ivar, um für den Code Zuweisen des richtigen settor Methode aufzurufen. Wie es ist, ist die Zuweisung Du nur die Ivar zu einer Autoreleased Objektinstanz, anstatt sie zu behalten. Das Ich." Präfix sicherzustellen, dass der Code das Richtige tut. Ohne sie ist die Zuweisung Sie nur die Variable, ohne es zu behalten.
Andere Tipps
würde ich prefixing logfile
mit self
in Ihrer Zuweisungsanweisung in Ihrem AppDelegate empfehlen. Zum Beispiel self.logfile = ...
Von den UIApplication
Klassenreferenz - UIApplication
Abtretungsempfänger und nicht die Delegierten behalten.
Als erstes müssen Sie Ihre Instanz von AppDelegate
initialisieren.