如何在多个实例方法中访问指针?

时间:2011-08-03 04:58:07

标签: objective-c variables instance

我不明白如何声明一个可以在多个方法中访问的指针。以下代码使用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的解决方法,但我认为这很麻烦,因为我正在上课,我想知道处理这个问题的更好的方法。

感谢您的帮助!

2 个答案:

答案 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