Как получить доступ к указателю в нескольких методах экземпляра? - PullRequest
0 голосов
/ 03 августа 2011

Я не понимаю, как объявить указатель, к которому можно получить доступ несколькими способами. Следующий код использует 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 ]

1 голос
/ 03 августа 2011

Правильным способом решения этой проблемы является управление памятью для вашего поля myContainer.

Я бы пошел с:

myContainer = [sender.titleLabel.text copy];

Рекомендуется использовать копию для NSString. Соответствующая тема для этого обсуждения: здесь .

Кроме того, не забудьте освободить память для поля myContainer. Вы можете сделать это в вашем методе dealloc:

-(void) dealloc {
    [myContainer release];
    [super dealloc];    
}
0 голосов
/ 03 августа 2011

Вы правы, говоря, что это проблема управления памятью.По сути, вы не «претендуете на владение» строкой, хранящейся в myContainer.Через некоторое (короткое) время после вызова storeToMyContainer: пул авто-выпуска, содержащий строку отправителя, истощается, и, поскольку вы не сказали, что все еще используете его, он перестает существовать.

Чтобы претендовать на владение строкой, вы должны retain (или copy) ее.Итак, обновляя ваш код:

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

Другой подход заключается в использовании properties .В любом случае, я рекомендую прочитать руководство по управлению памятью 1013 *, в частности Основные правила управления памятью .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...