Установить uilabel на функцию обратного вызова - PullRequest
1 голос
/ 02 сентября 2011

Я хочу установить текст uilabel для обратного вызова cfsocket, но он не работает. Ошибка: «Использование необъявленного идентификатора« метка »» Но этот setText работает в других функциях, почему не в этой?

Функция обратного вызова:

static void receiveData(CFSocketRef s, CFSocketCallBackType type, CFDataRef address, const void *data, void *info)
{
    UInt8 *buff;

    NSLog(@"%ld",CFDataGetLength(data));

    CFDataGetBytes(data, CFRangeMake(0, CFDataGetLength(data)), buff);

    NSLog(@"%s",buff);

    [label setText:@"toto"];
}

Функция, где работает setText:

- (IBAction)deconn:(id)sender
{
    if (conn_ok && socket && sock_addr) {
        CFSocketInvalidate(socket);
        [label setText:@"disconnected"];
        conn_ok = false;
        [sock_addr release];
    }

}

Хорошо, я сделал это в своей функции:

socketViewController *toto = (id)info;
[toto.label setText:@"received msg"];

Но это не работает, я получаю en EXEC_BAD_ACCESS, и у меня есть это в журнале:

sharedlibrary apply-load-rules all
warning: Unable to restore previously selected frame.
(gdb)

Я думаю, что это проблема доступа к памяти, я добавил toto = nil; в конце функции, но ничего не изменилось.

Ответы [ 2 ]

0 голосов
/ 02 сентября 2011

receiveData - статическая функция, поэтому она не будет иметь доступа ни к каким переменным-членам объекта (ivars, как они вызываются в Objective C).

0 голосов
/ 02 сентября 2011

receiveData - это функция, а не метод. Вы пытаетесь получить доступ к частному ивуру объекта. Если бы вы использовали аксессоры (self.label), это было бы более понятно. Используйте аксессоры.

С помощью указателя info можно передать self обратному вызову, чтобы получить доступ к метке.

Чтобы настроить указатель info, вам необходимо передать контекст при создании сокета:

CFSocketContext context = { 0, self, NULL, NULL, NULL };

Теперь при вызове CFSocketCreate... вы передадите &context для параметра контекста.

Вместо того, чтобы реализовывать свой собственный CFSocket, я обычно рекомендую cocoaasyncsocket . Это обеспечивает гораздо более простой интерфейс.

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