Вы путаете объявление переменных с выделением памяти / объектов. Важная часть вашего кода в обоих случаях на самом деле такова:
[UIImage imageNamed:@"image.png"];
Этот код вызывает метод class для класса UIImage, который делает несколько вещей. Одна из этих вещей - это выделение и инициализация объекта UIImage. В первом примере вы сохранили этот выделенный объект в переменной с именем myImage
. Затем вы переместили свой блестящий новый объект в другую (классовую) переменную, `imageView.image '.
UIImage *myImage = ...
Во втором примере, который вы дали, вы все еще храните этот выделенный объект в переменной, за исключением того, что в этом случае вы пропустили промежуточное присваивание и сохранили объект непосредственно в переменной класса imageView.image
.
imageView.image = [UIImage imageNamed:@"image.png"];
Один из способов представить переменные и объекты - сравнить их с домами. В этом сценарии переменная - это ваш адрес, а объект - ваш дом. Несколько человек могут иметь ваш адрес, но независимо от того, сколько их, когда они решают посетить, они идут в один и тот же дом. Так что в ваших примерах myImage
и imageView.image
- это адреса, указывающие на один и тот же дом или объект, экземпляр UIImage. В вашем примере вам на самом деле не нужно создавать промежуточную переменную, если вы не используете ее для каких-то других целей.
Что касается сбоев, вы должны прочитать Руководство по управлению памятью Apple . Это может занять некоторое время, но вы привыкнете к стандартам, которым Apple следует в отношении сохранения и освобождения объектов. Обратите внимание, что новый автоматический подсчет ссылок в XCode 4.2
облегчает многие из этих проблем, но также имеет свою собственную кривую обучения. Подводя итог, вы можете столкнуться с авариями, потому что вы выпускаете объект, который вам не принадлежит. Метод класса imageNamed
в UIImage возвращает автоматически выпущенный экземпляр этого класса. Вам не нужно отправлять его в своем коде на другую версию, и это вероятный источник сбоя вашей программы.