我在iPhone应用程序委托(AppDelegate)中检索/保留变量时遇到了一个非常奇怪的问题。最初,我可以单步执行并看到我的值传递给logfile(有问题的NSString变量),但是当从另一个类检索logfile时(参见下面的代码),它会出错。
这是我的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”很难。
我在这里做错了什么?这对我没有意义。
答案 0 :(得分:3)
您应该将logFile = tmp;
替换为self.logFile = tmp;
,因为您需要使用“自我”。分配ivar时的前缀,以便代码调用正确的settor方法。实际上,您只是将ivar分配给自动释放的对象实例,而不是保留它。自己。”前缀确保代码做正确的事情。没有它,你只是在不保留它的情况下分配变量。
答案 1 :(得分:0)
我建议您在AppDelegate的作业语句中使用logfile
前缀self
。例如,self.logfile = ...
答案 2 :(得分:-1)
从UIApplication
类引用 - UIApplication
分配并且不保留委托。
您需要先初始化AppDelegate
的实例。