Установка значения NSString внутри ответа UIAlertView, не может использоваться в другом месте? - PullRequest
2 голосов
/ 30 января 2011

Я первоначально задал вопрос здесь о получении строкового значения в UIAlertView, но теперь мне нужно его получить.Итак, я поставил это как новый вопрос, чтобы привести все в порядок и сделать его чище и яснее.

Итак, вот мой код:

В файле .h ..

@property (nonatomic, retain) NSString *myTestString;

Затем в файле .m он синтезируется с:

@synthesize myTestString

Затем в файле .m ...

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {

    if (buttonIndex == 0) {
    self.myTestString = @"test";
    }
}

-(void)somethingElse {

    NSLog(@"%@", myTestString);
}

Тогда я выпустил бы его в dealloc.

Этот код вызвал бы сбой в точке NSLog.

Как я могу предотвратить это?

1 Ответ

4 голосов
/ 30 января 2011

Я не уверен насчет использования вами @synchronize здесь. Свойства обычно синтезируются в файле .m, используя @synthesize propertyName;. @synchronize используется для обеспечения резьбы в многопоточных приложениях.

Еще одна вещь, которую я вижу здесь, это то, что myTestString может быть неопределенным в вашем -somethingElse методе, потому что вы присваиваете свойству значение только тогда, когда buttonIndex == 0. Возможно, вы захотите вставить значение по умолчанию для myTestString, либо в методе -init, либо в методе alertView:clickedButtonAtIndex:.

Подводя итог, я бы ожидал, что ваш класс будет выглядеть примерно так:

MyClass.h

@interface MyClass {
    NSString *myTestString;
}
@property (nonatomic, retain) NSString *myTestString;
@end

MyClass.m

@implementation MyClass

@synthesize myTestString;

-(id)init {
    if ((self = [super init]) == nil) { return nil; }
    myTestString = @"";
    return self;
}

-(void)dealloc {
    [myTestString release];
    [super dealloc];
}

-(void)alertView:(UIAlertView *)alertView
clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (buttonIndex == 0) {
        self.myTestString = @"test";
    }
}

-(void)somethingElse {
    NSLog(@"%@", myTestString);
}

@end
...