Отслеживание точек касания в изменяемом массиве - PullRequest
1 голос
/ 06 июня 2011

ОБНОВЛЕНИЕ: я понял, что метод "initWithFrame" никогда не вызывается, поэтому я поместил init моего массива в другом месте.Спасибо за прочтение.(для кого, какой смысл initWithFrame, если он не вызывается? "

Я смотрю на этот код около часа и, возможно, пропускаю простую и очевидную проблему. Я просто пытаюсьсохранить массив точек касания. Мой инициал UIView говорит это:

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
    // Initialization code
}
self.drawn=[[NSMutableArray alloc] init ];
return self;
}

Затем у меня есть это в другом методе:

CGPoint point=[[touches anyObject] locationInView:self];
NSLog(@"touched point: %f, %f",point.x,point.y);
[self.drawn addObject:[NSValue valueWithCGPoint:point]];

NSLog подтверждает, что «точка» существует и содержит хи у данных.

Почему тогда мой «нарисованный» массив никогда ничего не получает? Я прочитал учебники NSValue и, кажется, я делаю это правильно. NSLog [self.drawn count] всегда показывает 0, несмотря начто этот код сработал.

И, конечно, "нарисованный" - это также ивар моего пользовательского UIView, также правильно синтезированный.

Ответы [ 2 ]

3 голосов
/ 06 июня 2011

Ваш initWithFrame: никогда не вызывается, * и drawn никогда не создается. Из Руководства по управлению ресурсами :

В iOS любой объект, соответствующий протоколу NSCoding, инициализируется с использованием метода initWithCoder:. Это включает в себя все подклассы UIView [...] Пользовательские представления в iOS не используют метод initWithFrame: для инициализации.

Следовательно, значение drawn равно nil, а вызов [nil count] дает 0; [nil addObject:] аналогично ничего не делает.

Тем не менее, у вашего initWithFrame: также есть две проблемы с памятью. Ваше присваивание свойству чрезмерно сохраняет массив, и вы должны выполнять это присваивание внутри блока if.

Когда вы создаете NSMutableArray с использованием alloc / init, вы владеете этим массивом. Когда вы затем назначаете его, используя свойство, которое определено как сохраняющее, у вас появляется дополнительная претензия к этому объекту, которая может в конечном итоге вызвать утечку.

Второе: если по какой-либо причине вызов [super initWithFrame:frame] не удастся, self будет недействительным (nil), и использование одного из его свойств также будет некорректным. Это цель if(self). Вы должны сделать это вместо:

if(self){
    self.drawn = [NSMutableArray array];
}

Это создает автоматически выпущенную NSMutableArray, которую ваш вид затем сохраняет должным образом.


* Хотел бы я знать, почему тоже. используется в OS X.

0 голосов
/ 06 июня 2011

Я бы проверил, называется ли

- (id)initWithFrame:(CGRect)frame

.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...