Я заметил, что много программистов видит значение тестирования на рациональном уровне. Если Вы услышали вещи как "да, я знаю, что должен протестировать это, но я действительно должен был сделать это быстро", тогда Вы знаете то, что я имею в виду. Однако на эмоциональном уровне они чувствуют, что получают что-то сделанное только, когда они пишут реальный код.
цель, тогда, должна быть, чтобы так или иначе заставить их понимать, что тестирование на самом деле [только 114] способ иметь размеры, когда что-то "сделано", и таким образом дайте им внутреннюю мотивацию тестам записи.
я боюсь, что это намного более твердо, чем это должно быть, все же. Вы услышите много об оправданиях вроде, "я спешу, я перепишу/осуществлю рефакторинг это позже и затем добавлю тесты" - и конечно, продолжения никогда не происходит, потому что, удивительно, они столь же заняты на следующей неделе .
Я согласен с вами - документация по этому API в лучшем случае запутана. Основываясь на вашем опыте, я бы сделал вывод, что вы несете ответственность за время жизни обоих объектов - UIImage
и CGImageRef
. Вдобавок вы должны убедиться, что время жизни CGImageRef
не меньше, чем UIImage
(по понятным причинам).
Are you using Xcode 3.1 on Snow Leopard? I am experiencing the same issue:
CGContextRef ctx = ...;
CGImageRef cgImage = CGBitmapContextCreateImage(ctx);
UIImage * newImage = [[UIImage imageWithCGImage:cgImage] retain];
CGImageRelease(cgImage); // this should be OK, but it now crashes in Simulator on SL
I'm guessing that upgrading to Xcode 3.2 will fix the issue.
У меня такая же проблема в XCode 3.2.1 на Snow Leopard. У меня почти такой же код, как у Джейсона.
Я просмотрел пример кода iPhone, в котором используется imageWithCGImage
, и они всегда выпускают CGImageRef
с помощью CGImageRelease
после вызова imageWithCGImage
.
Так это ошибка симулятора? Я всегда получаю предупреждение malloc_error_break
на консоли, когда использую CGImageRelease
.
Согласно фундаментальному правилу управления памятью Какао , объект-владелец должен освободить принадлежащий объект, когда он больше не нужен. Другие объекты несут ответственность за получение и передачу права собственности по своему усмотрению. Если UIImage
требует, чтобы объект сохранялся, но не сохраняет и не копирует его, это ошибка в реализации UIImage
, и о ней следует сообщать как таковую.
<> Это не мое мнение. У меня была такая же проблема. Согласно документации
UIImage *image = [[UIImage alloc] initWithCGImage:imageRef];
имхо все ссылки корректны. Если вы используете CGDataProvider, пожалуйста, взгляните на CGDataProviderReleaseDataCallback и установите точку останова в вашем обратном вызове. Вы можете увидеть, что он корректно вызывается после того, как вы [освободите] ваше изображение, и вы можете освободить() ваш буфер данных изображения там.