2011-08-03 115 views
0

我不明白如何声明一个可以在多个方法中访问的指针。以下代码使用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,我没有问题。我需要做什么才能以这种方式访问​​useMyContainer中的myContainer

一些想法:我知道这是一个内存管理问题,我几乎可以肯定显示屏上正在调用retain(可能是通过.xib文件?),这就是为什么display挂起足够长时间才能使用在这两种方法中。

我知道一个解决方法,涉及到使用双精度和整数,但我认为这是凌乱的,因为我正在上这个课,所以我想知道用这种方法来处理这个问题。

感谢您的帮助!

回答

1

处理这个问题的正确方法是为您的'myContainer'字段处理内存管理。

我会去的:

myContainer = [sender.titleLabel.text copy]; 

建议使用副本的NSString。相关讨论的线索是here

此外,请不要忘记释放'myContainer'字段的内存。你可以在你的dealloc方法中做到这一点:

-(void) dealloc { 
    [myContainer release]; 
    [super dealloc];  
} 
+0

是否可以'[myContainer release]';在useMyContainer中使用它之后:? – Caborca87

+1

在技术上是的,这将工作。您基本上会立即放弃“myContainer”字段中的值。但是,通过这样做,您可以在代码中隐含一个隐含的假设。这个假设是:'useMyContainer:'&&'useMyContainer:'应该在'连续调用'之前调用'storeToMyContainer:'。如果'useMyContainer:'在一行中被调用两次(不调用'storeToMyContainer:'),则第二次调用将失败,因为释放了'myContainer'字段。 – Guven

0

你说这是内存管理问题是正确的。基本上,您并不是要求存储在myContainer中的字符串的“拥有权”。调用storeToMyContainer:之后的一段(短的)时间段后,包含发送者字符串的自动释放池将被耗尽,并且因为您没有说您仍在使用它,所以它不再存在。

要声明字符串的所有权,您必须retain(或copy)它。因此,更新您的代码:

- (IBAction)storeToMyContainer:(UIButton *)sender { 
    myContainer = [sender.titleLabel.text retain]; 
} 

另一种方法是使用properties。无论哪种方式,我建议您阅读Memory Management Programming Guide,特别是Basic Memory Management Rules

+0

感谢您的提示! – Caborca87

相关问题