Вы путаете переменные и свойства . Свойства поддерживаются переменными, но на самом деле они являются методами.
Здесь вы определяете свойство с именем teststring_B
, которое сохраняет все, что ему присвоено (и освобождает старое значение). Эквивалентные методы выглядят так (упрощенно):
- (NSString *)teststring_B {
// Return the content of the variable teststring_B.
return teststring_B;
}
- (void)setTeststring_B:(NSString *)val {
// Retain new value.
[val retain];
// Release old value in variable teststring_B
[teststring_B release];
// Assign the new, retained value to variable teststring_B
teststring_B = val;
}
Теперь вы можете использовать свойство двумя способами: либо с [self setTeststring_B:foo];
, либо с self.teststring_B = foo;
. Важным моментом является то, что последний является просто удобным способом написания, компилятор переведет его в первую форму, то есть компилятор превратит строки self.foo = bar;
в [self setFoo:bar];
.
Теперь, когда мы объяснили это в вашей аварии: у вас есть строковое значение, которое, скорее всего, автоматически выпущено. Теперь вы просто присваиваете его переменной teststring_B
, а не свойству. И вы забыли сохранить значение. Имущество сохранило бы это значение для вас.
Теперь назначенное значение было автоматически освобождено (оно не знало, что переменная все еще указывает на него), и позже новый объект ожил в том же месте памяти (если вам повезло). В любом случае, переменная teststring_B
теперь указывает не на текст, как вы думали, а на какой-то случайный объект (или мусор).
Есть два способа исправить это:
// First retain, then release; it might be the same object
// and if you would release it first its retain count might
// drop to 0 and get cleaned up before you can retain it again.
NSString *tmp = [textfield_2.text retain];
[teststring_B release];
teststring_B = tmp;
// Better !
self.teststring_B = textfield_2.text;