为什么NSString变空(没有理由)?

时间:2011-08-21 23:20:24

标签: iphone nsstring

我对Objective C感到很疯狂。请查看以下代码。

FirstViewController.h:

@interface FirstViewController : UIViewController {
    IBOutlet UITextView *textView;
    IBOutlet UIBarButtonItem *button;
    NSString* superString;
}

- (IBAction)buttonDown;

FirstViewController.m:

- (void)viewDidLoad {
    [super viewDidLoad];
    superString = [NSString stringWithFormat:"%@", @"A_super_string_file.txt"];
    [self buttonDown];
}

- (IBAction)buttonDown {
    NSError* err = nil;
    NSString* text = [NSString stringWithContentsOfFile:superString encoding:NSUTF8StringEncoding error:&err];
    [textView setText:text];
}
  1. 运行该应用程序。 A_super_string_file.txt在textView中成功显示。
  2. 按按钮。应用程序崩溃是因为superString引用与步骤1中相同的地址,但此地址上有另一个变量或没有任何内容。关于superString的打印描述不显示任何内容或随机显示其他变量(可能是不同的类型)。
  3. 会发生什么?我是技能开发人员但在这种情况下不知道。非常感谢您的帮助!

    更新:可能,它在工作中隐藏了自动释放。但是当它释放内存?每次或在某个确切时刻的不同时刻?

2 个答案:

答案 0 :(得分:4)

NSString的+ stringWithFormat:自动释放。如果你想让它留在身边,你需要保留它。

属性是一种很好的方法,因为它可以减少您需要担心的内存管理量。

·H

@interface FirstViewController : UIViewController {
    IBOutlet UITextView *textView;
    IBOutlet UIBarButtonItem *button;
    NSString* superString;
}

@property (nonatomic, copy) NSString* superString;

- (IBAction)buttonDown;

的.m

@synthesize superString

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setSuperString:[NSString stringWithFormat:"%@", @"A_super_string_file.txt"]];
    [self buttonDown];
}

- (IBAction)buttonDown {
    NSError* err = nil;
    NSString* text = [NSString stringWithContentsOfFile:superString encoding:NSUTF8StringEncoding error:&err];
    [textView setText:text];
}

- (void)dealloc {
    [superString release];
    [super dealloc];
}

答案 1 :(得分:1)

您需要保留superString。

[superString retain];
创建后立即

然后以dealloc发布它。