2012-04-11 56 views
0

我不能belice我问这个,但即时通讯非常疯狂与这个可变的东西。变量在我的iOS应用程序?

我想保存用户名信息。我加载他们在我看来的负载。在此之后,当我点击一个按钮时,我将获得信息。

这里是我的代码:

@interface SelfViewController : UIViewController 
{ 
    NSString *usernameString; 
} 



- (void)viewDidLoad 
{ 
    usernameString = @"test"; 
} 



- (IBAction)goToProfileButtonPressed:(id)sender 
{ 
    NSLog(@"%@", usernameString); //CRASH BAD EXEC 

} 

我是怎么错了????

+0

你应该合成你的iVar并生成一个属性。你会得到一个坏的执行错误,因为你确实保留了自动释放的NSString @“test” – CarlJ 2012-04-11 14:23:36

+0

该代码除了它不是一个完整的小例子之外没有任何问题。你也应该说明你是否使用ARC。 – Joe 2012-04-11 14:23:57

+0

我的第一个猜测是该按钮未正确连接到SelfViewController的实例。如果你删除了'NSLog',你能按下按钮而不会导致崩溃吗? – Dondragmer 2012-04-11 14:25:12

回答

1

更改您的.h文件:

@interface SelfViewController : UIViewController { 
    NSString *usernameString; 
} 

@property (retain, nonatomic) NSString *usernameString; 

然后在你的.m文件中:

@synthesize usernameString; 

- (void)viewDidLoad { 
     self.usernameString = @"test"; 
} 

- (IBAction)goToProfileButtonPressed:(id)sender { 
    NSLog(@"%@", self.usernameString); // "self." can be omitted, but it is best practice not to 
} 

- (void)dealloc { 
    [usernameString release]; 

    [super dealloc]; 
} 

问题是您将usernameString分配给自动发布的字符串对象。在按下该按钮时,usernameString已被释放,并已成为垃圾内存。通过保留它(并且随后在-dealloc中释放它以避免泄漏),您知道它不会过早释放。

+0

自我是问题。谢谢 – Kovu 2012-04-11 14:47:46

+0

没问题 - “self”意味着不是直接设置变量,而是根据属性类型执行操作。正如我们已经设定它保留(和非原子,这意味着它是线程不安全但更快),通过使用'self'它保留。希望这是有道理的! – jrtc27 2012-04-11 14:51:27

+0

只是一个小的术语更正:“问题是您将usernameString分配给自动释放的字符串对象”< - 实际上不是,从方法返回时,字符串常量* *不*自动释放并且*不*释放。但是,在范围结束后,它们会从内存中清除。堆栈分配的本地数组发生的情况也是如此。 – 2012-04-11 15:03:31

0

您需要综合ivar并将其作为属性添加。 (对于未-ARC编译):

@interface SelfViewController : UIViewController 
{ 
    NSString *usernameString; 
}  
@property (nonatomic, retain) NSString *usernameString; 
在.M

在.H

@synthesize usernameString; 
+0

没有这个,没有任何变化 – Kovu 2012-04-11 14:29:13

相关问题