Если его очистить, когда он станетFirstResponder, я предполагаю, что у вас @property (nonatomic) BOOL clearsOnBeginEditing установлен в YES.
Возможно, где бы вы ни заботились о создании textField, добавьте textField.clearsOnBeginEditing = NO;
Если вы используете конструктор интерфейса, в свойствах текстового поля есть флажок.
Относительно того, почему он падает в большинстве случаев ...
свойство text определяется как: @property (nonatomic, copy) NSString * text
Копия означает, что когда вы присваиваете ей значение, оно освобождает предыдущее значение, а затем делает копию переданного значения.
Ваша первая строка: вы держите указатель вокруг объекта NSString, не вызывая retain для него. Поэтому, когда вы вызываете становление становления становления с опцией clearsOnBeginEditing, это установит новое значение в пустую строку NSString, которая освободит старую строку NSString, на которую ссылалась UITextField. Поскольку это единственное, что имело право собственности, этот вызов освобождения вызовет Deloc на NSString, что сделает его недействительным.
Затем вы переназначаете его обратно в текстовое свойство, где он пытается скопировать освобожденный объект.
Так что, чтобы сделать это так, как у вас, вам нужно будет позвонить сохранить и отпустить:
NSString *tmpTxt = [textField.text retain];
BOOL result = [textField becomeFirstResponder];
textField.text = tmpTxt;
[tmpTxt release];
Однако все, что вам нужно сделать, это установить для clearsOnBeginEdit значение NO, и этот код вам не понадобится.