我不明白如何声明一个可以在多个方法中访问的指针。以下代码使用myContainer
来存储在调用useMyContainer
时使用的数字。
@interface MyViewController : UIViewController {
NSString *myContainer;
IBOutlet UILabel *display;
}
- (IBAction)storeToMyContainer: (UIButton *)sender;
- (IBAction)useMyContainer: (UIButton *)sender;
@end
@implementation MyViewController
- (IBAction)storeToMyContainer: (UIButton *)sender {
myContainer = sender.titleLabel.text;
}
- (IBAction)useMyContainer: (UIButton *)sender {
[someOtherClass doSomethingWith:[myContainer doubleValue]];
}
@end
我不明白的是,当我以同样的方式使用display
时,我没有遇到任何问题。要以这种方式访问myContainer
中的useMyContainer
,我需要做什么?
一些想法:我知道这是一个内存管理问题,我几乎可以肯定显示retain
正在显示(可能是.xib文件?)这就是为什么display
悬挂的时间足够长,可用于两种方法。
我知道一个涉及使用double和int的解决方法,但我认为这很麻烦,因为我正在上课,我想知道处理这个问题的更好的方法。
感谢您的帮助!
答案 0 :(得分:1)
处理此问题的正确方法是为'myContainer'字段处理内存管理。
我会选择:
myContainer = [sender.titleLabel.text copy];
建议使用NSString的副本。该讨论的相关主题是here。
另外,请不要忘记释放'myContainer'字段的内存。您可以在dealloc方法中执行此操作:
-(void) dealloc {
[myContainer release];
[super dealloc];
}
答案 1 :(得分:0)
你说这是一个内存管理问题是正确的。基本上,您不是“声明对myContainer
中存储的字符串的所有权”。在调用storeToMyContainer:
之后的一段(短)时间内,包含发件人字符串的自动释放池已耗尽,并且由于您没有说您仍在使用它,因此它不再存在。
要声明字符串的所有权,您必须retain
(或copy
)。所以,更新你的代码:
- (IBAction)storeToMyContainer:(UIButton *)sender {
myContainer = [sender.titleLabel.text retain];
}
另一种方法是使用properties。无论哪种方式,我建议您阅读Memory Management Programming Guide,特别是Basic Memory Management Rules。