#iphone #memory-management
#iPhone #управление памятью
Вопрос:
У меня есть 5 UIViews, которые выделяются с одним и тем же изображением.
После выделения они появляются с такими адресами:
[0] = 0x0000000117068650
[1] = 0x00000001151ea1c0
[2] = 0x00000001151a77f0
[3] = 0x00000001170026c0
[4] = 0x00000001151b5c40
Это то, что я делаю
UIImage *Image = [UIImage imageNamed:@"Something.png"];
UIImageView *Containers[5];
for (int i = 0;i < 5; i )
{
Containers[i] = [[UIImageView alloc] initWithImage:Image];
Containers[i].frame = CGRectMake(0,0, Image.size.width, Image.size.height);
[self.view addSubview:Containers[i]];
}
Конечно, проект намного сложнее, но как это может произойти? Связано ли это с тем, как я объявляю UIImageViews?
Комментарии:
1. что-то не так с этими адресами? в конце концов, ваш симулятор использует виртуальную память. Кроме того, в Objective-C рекомендуется называть все переменные (и имена методов) строчными буквами. Поэтому используйте »
containers
» вместо »Containers
«, »image
» вместо »Image
» и т. Д.2. Это обычные 64-разрядные адреса памяти…
3. строка 6 не нужна, потому что при использовании initWithImage для фрейма устанавливается значение (0, 0, ширина, высота).
4. Проблема заключалась в том, что этот код приводил к сбою приложения. Настоящая проблема заключалась в том, что UIImage * на самом деле был переменной класса, и после него был объявлен int X[10] . К сожалению, в какой-то момент в программе это произошло X[-1] = TRUE; Таким образом, UIImage изменился на логическое значение TRUE . Вы можете себе представить результат. Мне совсем не нравится, что компилятор не вылетает, когда вы говорите array[-1] = something . Это очень плохо.