Добавление подпредставлений с помощью цикла в UIScrollView приводит к утечке памяти - PullRequest
1 голос
/ 09 января 2012

Я новичок в Objective-C и пытаюсь создать приложение, похожее на Springboard. Таким образом, я получил UIScrollView, в котором я делаю цикл для генерации группы подпредставлений из другого UIViewController.

Вот мой код:

@implementation ProjectsListViewController {
    ProjectViewController *icon;
}

-

int row = 0;
int column = 0;
int page = 0;

for (int i = 0; i < 5; i++) {

    icon = [[ProjectViewController alloc] init];

    icon.iconPath = @"icon.png";
    icon.iconTag = i;

    int x = (1024 * page) + ((50 + (10 * column)) +  (188 * column));
    int y = (40 + (150 * row));

    icon.view.frame = CGRectMake(x, y, icon.view.frame.size.width, icon.view.frame.size.height);

    [self.scrollView addSubview:icon.view];

    // Add a new page if we reach the end of one
    if ((column == 4) && (row == 3)) {
        row = 0;
        column = 0;
        page++;

        // Add a new line if we reached last column
    } else if (column == 4) {
        column = 0;
        row++;

        // Add a column otherwise
    } else {
        column++;
    }
}

Все это происходит в методе viewDidLoad. Пока там, если я запускаю приложение, все в порядке, значки есть. Но когда я хочу щелкнуть значок (на кнопке есть IBAction, чтобы перейти в другое представление), мое приложение вылетает из-за возможных утечек памяти. Кажется, что нет больше ссылки на подпредставления.

Единственное решение, которое я нашел, - добавить каждый ProjectViewController внутри NSMutableArray. Таким образом, я могу нажимать на значки и открывать другой вид.

Может кто-нибудь объяснить мне, что я делаю не так?

Извините, если это звучит нудно для ваших ушей, я пытаюсь учиться!

Примечание: я использую ARC.

Ответы [ 4 ]

1 голос
/ 09 января 2012

если ничто не ссылается на класс значков вне цикла, он будет собираться ARC. поэтому добавление их в список решает проблему. Вы добавляете вид значка в список, чтобы на него в конце концов ссылались. но ничто не отслеживает сами значки.

0 голосов
/ 10 января 2012

Антуан, решение, которое вы сделали с массивом, работает, я бы так и оставил.

Чтобы понять, что происходит без массива
• значок ProjectViewController (он создается на лету и выпускается ARC)
• добавление icon.view в любое представление приведет к его сохранению указанным представлением
• когда срабатывает значок, он пытается отправить сообщение на экземпляр ProjectViewController, который больше не действителен

Используя ваш массив (я предполагаю, что это свойство (сильное)), каждый экземпляр ProjectViewController, добавленный в массив, не будет освобожден ARC, и когда срабатывает действие вашего значка, метод отправляется действительному объекту.

0 голосов
/ 09 января 2012

вместо:

icon = [[ProjectViewController alloc] init];

Я бы сделал:

ProjectViewController *projectViewController = [[ProjectViewController alloc] init];

Таким образом, вы создаете новый экземпляр ProjectViewController для каждого раза в цикле, другой способ перераспределяет то же самоеUIViewController каждый раз через.

0 голосов
/ 09 января 2012

Вы должны использовать UIButton вместо изображений, если они привязаны к IBAction. Таким образом вы сохраняете свой код модульным, и вам не нужно беспокоиться об управлении памятью двух разных объектов и действий.

Кроме того, Вы должны проверить последний ответ на этот вопрос: Почему статическая утечка NSString?

...