2012-01-09 5 views
1

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

Вот мой код:

@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 на кнопке, чтобы перейти к другому представлению), мое приложение вылетает из-за возможных утечек памяти. Кажется, что больше нет ссылок на subviews.

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

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

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

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

+0

Связано ли IBAction с ProjectViewController? Если это так, я думаю, что это проблема. Кроме того, работает ли ваше «единственное решение, которое я нашел», или это была ваша единственная идея? –

+0

Вам необходимо предоставить трассировку стека. Утечка памяти не является источником сбоя (обычно) – Zepplock

+0

Мне не хватает «addTarget» для каждого значка. Где вы это устанавливаете? –

ответ

0

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

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

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

0

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

Кроме того, Вы должны проверить последний ответ на этот вопрос: Why does static NSString leak?

0

вместо:

icon = [[ProjectViewController alloc] init]; 

Я хотел бы сделать:

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

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

+0

Если они используют ARC, нет необходимости вызывать выпуск. – madmik3

+0

Ой, я этого не видел. Извините, я обновил код соответственно. Спасибо –

1

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

+1

Сбор мусора на iOS? –

+0

Объекты значков выходят за пределы области действия в конце цикла. Вам нужно управлять объектами значков в массиве или словаре, чтобы они не были выпущены. – bbarnhart

+0

извините, ARC не GC. – madmik3

Смежные вопросы