#iphone #objective-c
#iPhone #objective-c
Вопрос:
Я совсем новичок в разработке iPhone. Моя цель — приложение удаленного управления, сервером которого является TightVNC. Но я столкнулся с проблемой, и это сводит меня с ума… Я успешно подключился к серверу (используя сокет), и далее хотел бы запрашивать обновление рабочего стола, по крайней мере, каждую секунду. Итак, здесь появляется таймер, который создается с помощью селектора в «performSelectorInBackground». Основная задача таймера — как собрата:
int picLength;
[self readExact:(char*)(amp;picLength) bySize:sizeof(int)];
char *picBuffer;
picBuffer = (char *)malloc(picLength);
[self readExact:picBuffer bySize:picLength];
NSData *picData = [[NSData alloc]initWithBytes:picBuffer length:picLength];
[self performSelectorOnMainThread:@selector(setPicInMainThread:) withObject:picData waitUntilDone:YES];
[picData release];
free(picBuffer);
И «setPicInMainThread» выглядит следующим образом (каждое изображение имеет размер около 200 КБ, iTouch подключен к ПК через Wi-Fi между компьютерами, поэтому скорость будет достаточно высокой):
- (void) setPicInMainThread:(NSData *)data {
[chatController.imageView.image release];
chatController.imageView.image = [UIImage imageWithData:data];
}
Приложение завершает работу после представления первого обновления для рабочего стола. Мне интересно, сталкивался ли я с «утечкой памяти», касающейся NSTimer и NSData, о которой говорят многие люди… Если да, есть ли какой-либо способ решить проблему? Большое вам спасибо за помощь!
Комментарии:
1. Я не вижу таймер в вашем коде или где вы запускаете что-либо в фоновом потоке? Возможно, вы вставляете неправильную версию в качестве текущего вызова [self performSelectorOnMainThread:@selector (setPicInMainThread:) с объектом:picData waitUntilDone:ДА]; ничем не отличается от вызова [self setPicInMainThread:picData];
2. каким образом вы определили свойство chatController.ImageView.image ?
3. Вызов [chatController.ImageView.image release];, похоже, находится в необычном месте. Не могли бы вы объяснить, что вы надеетесь получить с помощью этого вызова?
4. Спасибо вам, ребята! Я удалил «performSelectorOnMainThread», попытался определить меньше переменных и добавил пул авторелиза, теперь это работает в любом случае ~ Но я помню, что читал статью о том, как не изменять объекты пользовательского интерфейса в фоновом потоке…
Ответ №1:
Ваш код malloc выглядит плохо. Зачем вам брать адрес int, а затем приводить его как указатель на символ? Тогда зачем вообще передавать значение int для размера той же функции, которую вы передаете char * для установки? У меня такое чувство, что вы получаете EXC_BAD_ACCESS, и это из-за ваших первых нескольких строк и метода readExact. Убедитесь, что вы получили правильную длину и передали правильные параметры.
int picLength;
[self readExact:(char*)(amp;picLength) bySize:sizeof(int)];
char *picBuffer;
picBuffer = (char *)malloc(picLength);
Комментарии:
1. Большое вам спасибо! Я знаю, что это выглядит плохо, в любом случае, кажется, что использовать malloc в приложении для iPhone необходимо… Поэтому я отбрасываю его и просто использую «char picBuffer[picLength];» Но я уверен, что длина правильная ~ 🙂
2. Есть допустимые случаи использования malloc на iPhone, особенно при взаимодействии со старыми функциями C, но мне кажется, что вы неправильно используете readExact, но я не могу быть уверен, не видя кода.