Объявление объекта на уровне класса, проблемы. iPhone Objective-C - PullRequest
0 голосов
/ 26 октября 2009

Цель C на iPhone: Я пытаюсь объявить следующий объект на уровне класса, чтобы мне не пришлось повторно подключать этот сокет каждый раз, когда я что-то записываю в него. (Пишу вещи несколько раз в секунду) всякий раз, когда я пишу постоянный поток живых данных, примерно каждые 2 секунды он зависает. Я не знаю почему, но это так.

Код:

Socket *socket = [Socket socket];
[socket connectToHostName:@"10.0.2.3" port:1220];

Я попытался объявить переменную в данных экземпляра, а затем инициализировать ее в + initialize и viewdidload, но безуспешно или с ошибками. Я часами пытаюсь найти способ, чтобы это сработало, и после примерно 20 различных решений я не нашел ни одного, который бы работал. Сокет, кстати, является объектом из пакета smallsockets для target-c.

Маленькие розетки: http://smallsockets.sourceforge.net/

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

Любая помощь очень, очень ценится.

Спасибо !!

[Изменить]

Вот пример кода моих попыток: объявление экземпляра:

Socket *socket; 

viewDidLoad:

socket = [Socket socket]; //Throws error on compile 

Альтернативный режим просмотра:

Socket *tempSocket = [Socket socket];
socket = tempSocket;
//This compiles fine, however it doesn't work when trying to use it

Ответы [ 5 ]

2 голосов
/ 26 октября 2009

Не создавайте сокет в + initailize, это очень рано.

Добавьте некоторую запись отладки (NSLog ()) в ваш код в viewDidLoad и зарегистрируйте сокет, чтобы увидеть, создается ли он. Затем установите для него точку останова в gdb и посмотрите, допустимо ли это.

-W

1 голос
/ 26 октября 2009

Код для +socket было бы интересно посмотреть. Я предполагаю, что это удобный метод, то есть результаты этого сокета автоматически высвобождаются. Теперь я не знаю, сохраняете ли вы это в свойстве сокета или нет, но вы должны, в противном случае после завершения цикла запуска, сокет будет освобожден. то есть вам нужно

@property (retain) Socket *socket; 

в вашем файле интерфейса.

0 голосов
/ 26 октября 2009

Попытка объявить на уровне класса?

Вы хотите сказать, что хотите, чтобы "socket" представлял собой глобальную переменную в области классов, которую вы инициализируете для всего класса, а не для экземпляра? Если это так, вы не можете объявить сокет как переменную экземпляра. Переменные экземпляра существуют только для экземпляров (то есть выделенных объектов). Вместо этого вы должны объявить это вне класса. Глобальные переменные обычно объявляются под строками #import в файле .m.

Тогда вы можете инициализировать его где угодно. Я рекомендую метод класса, который вы вызываете из applicationDidFinishLaunching:

#import "Socket.h"

Socket *globalSocket = nil;

@implementation Socket

+ (void)connectGlobalSocket
{
    if (!globalSocket)
    {
        globalSocket = [[Socket socket] retain];
        [globalSocket connectToHostName:@"10.0.2.3" port:1220];
    }
}

....
0 голосов
/ 26 октября 2009

Так что же произойдет, если пункт назначения недоступен или какая-то другая проблема в сети вызывает задержку? Как насчет того, если ваш удаленный разъем ожидает какого-то подтверждения, но ваш iPhone покупается в то время, когда он должен отправлять ACK? Если вы не используете какой-то подобный select () механизм, вы должны, по крайней мере, выполнять всю работу по синхронной сети в другом потоке. NSThread стоит посмотреть.

0 голосов
/ 26 октября 2009

Возможно, вы захотите использовать AsyncSocket , который предлагает асинхронные операции с сокетами (поверх CFSocket и CFStream).

Я нашел это в этом StackOverflow ответе .

...