Написание собственной фотогалереи iPad - ошибка Dealloc

я хочу написать свою собственную фотогалерею, как оригинальный «Photos.app» от Apple. Я создал UITabbarcontroller в AppDelegate, а затем «ImageViewController» и «VideoViewController».

В «ImageViewController» я добавил UIScrollView, а затем создал экземпляр моей собственной «PhotoGallery» с различными свойствами, такими как imagePerRow, изображения, отступы и т. д.

Для "PhotoGallery" я создал новый класс target-c как подкласс "NSObject", где я позиционирую все различные изображения как UIButtons. Затем я добавил еще одну функцию, которая описывает расположение всех изображений при изменении ориентации устройства. И Dealloc-функция. Это все.

Этот класс отлично работает, также перестановка при изменении ориентации устройства. Проблема в том, что если я имитирую предупреждение памяти в ios-симуляторе, в первый раз, когда PhotoGallery правильно освобождается, но если я снова имитирую предупреждение, я получаю сообщение об ошибке: «[PhotoGallery release]: сообщение отправлено в освобожденный экземпляр ".

Я думал, это из-за подкласса NSObject, верно? Затем я протестировал его как UIView. С той же ошибкой. Так что знайте, я больше не знаю, что делать. Надеюсь, вы понимаете, в чем проблема, и дадите мне несколько советов по этому поводу. Подумайте о том, чтобы снова вызвать функцию инициализации? Как? Нужен "drawRect"? Я понятия не имею.

Спасибо за ваше время и помощь, Г.


person geforce    schedule 05.01.2011    source источник
comment
Это не отвечает на ваш вопрос (следовательно, добавление его в качестве комментария), но рассматривали ли вы возможность использования three20? У них отличная реализация большинства вещей приложения Photos.   -  person donkim    schedule 06.01.2011
comment
Ага. Спасибо за ответ. Я хочу научиться писать такие вещи самостоятельно. Я просмотрел исходный код three20, но на данный момент он слишком сложен для меня, поэтому я решил изучить его шаг за шагом.   -  person geforce    schedule 06.01.2011


Ответы (1)


Вы, вероятно, не устанавливаете свойство, которое содержит ссылку на PhotoGallery, на ноль.

т.е. Вы сохраняете ссылку на освобожденный экземпляр и пытаетесь вызвать для него release.

плохой пример:

- (void) didReceiveMemoryWarning
{
    [photoGallery release];
}

безопасный(r) пример:

- (void) didReceiveMemoryWarning
{
    [photoGallery release];
    photoGallery = nil;

    // or combine both actions if your property attributes are set up to accommodate it:
    // self.photoGallery = nil;
}

В плохом примере photoGallery по-прежнему содержит ссылку на уже освобожденный экземпляр, и второе предупреждение о памяти попытается отправить ему сообщение.

В примере с safe(r) photoGallery равно nil, и отправка сообщения на nil безопасна.

person codelark    schedule 05.01.2011
comment
ДАААААААААААААААА! Большой! Это так легко исправить?! Хороший! Я думал, что мой ViewController или подкласс NSObject должен быть исправлен. Но точно, я не устанавливал фотогалерею на ноль! - person geforce; 06.01.2011
comment
Но еще один вопрос: должен ли класс PhotoGallery быть подклассом NSObject или UIView? Какие преимущества для обоих? - person geforce; 06.01.2011
comment
методы управления памятью объявлены в NSObject. Наследование от UIView дает вам все встроенные функции представления. Когда возникает вопрос о наследовании, спросите, является ли мой класс ‹вставьте имя класса›? Если да, то наследуйте от него. - person codelark; 06.01.2011