Что происходит за кулисами, когда я создаю новый UIImage по назначению? - PullRequest
0 голосов
/ 23 августа 2009

Я получаю ошибки типа EXC-BAD-ACCESS, где я создаю новый экземпляр UIImage, присваивая значение уже существующего UIImage (как показано ниже), и пытаюсь выяснить, в чем проблема. Существует куча кода для сортировки, и я не уверен, с чего начать, поэтому я не буду беспокоиться о публикации исходного кода - но это может помочь мне в моем расследовании, любой из вас может сказать мне Что именно происходит (по памяти), когда я создаю новый UIImage, назначая из другого?

(in the .h)

UIImage* myExistsImage;

...

@property (retain) UIImage* myExistsImage;

...

-(UIImage*)rotateImage:(UIImage*)imageToRotate;



----------------------------------------------------


(in the .m)
@synthesize myExistsImage;

...

UIImage* myNewImage = [self rotateImage:myExistsImage];


...

-(UIImage*)rotateImage:(UIImage*)imageToRotate
{

UIImage* rotatedImage = imageToRotate;

//Rotate Image Here (details omitted)...

 return rotatedImage;
}

Ответы [ 2 ]

2 голосов
/ 23 августа 2009

с кодом типа:

UIImage* src;
UIImage* dst = src;

... все, что вы делаете, это копируете указатель. Чтобы убедиться, что dst и src будут продолжать указывать на действительный UIImage, вам нужно дважды retain позвонить на UIImage - один раз для src и один раз для dst , Когда вам больше не нужен указатель, вы должны вызвать release на UIImage - когда все указатели исчезнут, последний вызов release освободит UIImage. То, что вы видите, это то, что UIImage выпускается, пока вы все еще заинтересованы в его использовании; тогда вам нужно retain, чтобы этого не произошло.

2 голосов
/ 23 августа 2009
UIImage* rotatedImage = imageToRotate;

В этой строке вы не создаете новый объект UIImage; вы просто создаете новый указатель на старый. Если Rotate Image Here подразумевает модификации на месте к rotatedImage, то вы фактически также модифицируете myExistsImage.

Если вы хотите создать новый объект UIImage для хранения повернутого объекта, вам нужно явно сделать это с помощью методов UIImage alloc и init.

...