Вызов глобальной переменной работает только в первый раз - PullRequest
1 голос
/ 03 апреля 2010

Я определил глобальную переменную, которая вызывается из другого представления, и она работает в первый раз, но не в следующих, она сохраняется со значением из первого вызова! Предположим, что это фундаментальная проблема какао, и переменная не определяется должным образом в соответствии с ее потребностями. Спасибо за любую идею, чтобы решить это.

Объявление:

@interface TableArchiveAppDelegate : NSObject <UIAppDelegate> {

    NSString        *varName;
}

@property (nonatomic, copy) NSString *varName;

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

@synthesize varName;

-(void)test{

        varName = textField.text;
}

и запрос из другого вида:

- (void)viewDidLoad {


    TableArchiveAppDelegate *mainDelegate = (TableArchiveAppDelegate *)[[UIApplication sharedApplication] delegate];

    name.text = mainDelegate.varName;

    [super viewDidLoad];
}

1 Ответ

1 голос
/ 03 апреля 2010

Не уверен, что я понимаю вопрос, но представленный код приведет к тому, что атрибут varName будет содержать любое значение, заданное в textField.text при вызове метода -test. Если вы никогда не назначите ему другое значение, оно сохранит это начальное значение навсегда.

Ваша проблема может быть в том, что вы не используете синтезированные средства доступа.

Это:

@property (nonatomic, copy) NSString *varName;

... создает синтезированный метод доступа, который копирует объект NSString, переданный ему, путем создания другого экземпляра NSString и заполнения его значением прохода NSString. Однако это:

varName = textField.text;

... назначает varName на адрес строки, содержащейся в textField.Text. Ничего не копируется. Если textField.text изменяется, то меняется и varName, потому что два iVars имеют одинаковое строковое значение по одному и тому же адресу. Кроме того, когда textField.text освобождает строку, она также исчезает из varName.

Для копирования строки textField.text вам необходимо использовать:

self.varName = textField.text;

... чтобы вызвать синтезированный метод доступа, в котором есть функция копирования.

В общем, вы всегда должны использовать нотацию self. при обращении к собственным свойствам класса, чтобы гарантировать, что они должным образом сохраняются / копируются / освобождаются и т. Д. Единственное исключение, конечно, если вы пишете свой собственный метод доступа ,

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