Это слегка хитрая вещь; Понятно, что это вызывает путаницу. Два пути здесь приводят к image
хранению объектов с разными статусами владения и, таким образом, с разным количеством ссылок.
Пройдя через if
, вы получите image
с объектом, который не принадлежит вашему коду.
UIImage * image = [[UIImage alloc] initWithData:receivedData];
// If |initWithData:| succeeds, the object in |image| is owned, because you
// called |alloc| to create it.
if (image == nil) {
image = [UIImage imageNamed:@"null.bmp"];
// This object is _not_ owned by your code and you must not send
// |release| to it.
}
// ... the setter lines are irrelevant to the reference count of |image|.
[image release];
// This is only okay if |initWithData:| succeeded and you have ownership
// of |image|.
Я думаю, что анализатор показывает неправильную строку, точно так же, как компилятор будет пожаловаться на пропущенную точку с запятой пятью строками позже.
Чтобы решить эту проблему, можно сохранить изображение, полученное с imageNamed:
Вы не можете просто не отправить release
, потому что вы делаете владеете image
в одном случае, и вам нужно должным образом отказаться от этой собственности. Я также предложил бы добавить комментарий об отправке retain
, чтобы вы помнили восемь месяцев спустя, почему вы это сделали.
Лучше, чем это, как предложено ниже неподражаемым Bavarious, и, как я думаю, вы сами уже поняли, было бы автоматически выпустить изображение alloc
и удалить более позднюю строку release
.