То, что вы делаете, по существу правильно, если global
либо имеет старое значение, которое вам больше не нужно, или равно nil
.Если это один из иваров класса, он будет nil
при создании экземпляра класса.Одна загвоздка в том, что если новый indexPath
окажется тем же объектом, что и тот, который уже находится в global
, у вас будет перевыпуск и вылетит.
// global points to object at 0x8BADFOOD
// indexPath also happens to be 0x8BADFOOD; for some reason, it
// hasn't changed since last time. This _can_ happen.
[global release]; // object at 0x8BADFOOD is deallocated
global = [indexPath copy]; // indexPath no longer valid!
// Crash! Bang! Boom!
Способизбежать этого - использовать временную переменную.
Когда вы объявляете свойство как copy
и синтезируете это свойство, созданный метод установки выглядит по сути так, и вы можете сделать то же самое:
- (void)setMyFloozit:(Floozit *)newFloozit {
// Copy first in case newFloozit and myFloozit are for
// some reason the same object
// Take ownership of a copy of newFloozit
Floozit * tmp = [newFloozit copy];
// We no longer need old value of myFloozit, so we release it.
[myFloozit release];
// tmp contains a value that we own, we just need to assign
// it to the correct name.
myFloozit = tmp;
}
Это можно сделать немного лучше, сначала проверив, одинаковы ли newFloozit
и myFloozit
, и ничего не сделав, если они есть.