Я использую класс AsyncSocket для приложения чата. Но я хочу использовать экземпляр AsyncSocket, созданный на странице входа для всего проекта. Это означает, что я хочу повторно использовать экземпляр AsyncSocket, созданный на странице входа в класс chatViewControl. Может ли кто-нибудь помочь мне найти решение?Как объявить экземпляр AsyncSocket глобальным
ответ
Вы должны действительно избегать глобального состояния, где это возможно (см. Ссылку Свена). В общем, вы, вероятно, лучше иметь какой-то объект, который вы передаете другим объектам.
Например, текущее приложение, над которым я работаю У меня есть объект ServerInfo, который я создаю перед входом в систему и передаю каждому новому контроллеру представления при его создании, и он содержит сокет, информацию о шифровании, текущий идентификатор сообщения , имя пользователя и т.д.
Однако, чтобы ответить на вопрос о том, как объявить его как глобальный, вы можете сделать это так же, как в C:
в login.h:
extern AsyncSocket *g_socket;
в login.m:
AsyncSocket *g_socket;
то при создании сокета:
g_socket = [[AsyncSocket alloc] init];
и когда вы хотите использовать его в других файлах:
#import "login.h"
...
[g_socket sendData:...];
Если вы хотите иметь приложения широкое указания на single AsyncSocket
, вы можете рассмотреть это как свойство вашего application delegate. Вы можете сделать это по следующим направлениям:
// SampleAppDelegate.h
#import <Foundation/Foundation.h>
@class AsyncSocket;
@interface SampleAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
AsyncSocket *socket;
}
@property (nonatomic,retain) AsyncSocket *socket;
// SampleAppDelegate.m
#import <SampleAppDelegate.h>
#import <AsyncSocket.h>
@implementation SampleAppDelegate
@synthesize socket;
- (void)applicationDidFinishLaunching:(UIApplication *)application
{
[window addSubview:[splitViewController view]];
[window makeKeyAndVisible];
self.socket = [[AsyncSocket alloc] init]; // I can't remember this off the top of my head!
}
С этого момента вы можете получить доступ к сокет просто делать:
AsyncSocket *socket = [UIApplication sharedApplication] delegate] socket];
Пробовал ваше предложение, поместив сокет внутри AppDelegate, но когда я попытался получить доступ с других контроллеров представлений, вызов метода сокета не выйдет -> [UIApplication sharedApplication] delegate]. Я использую CocoaAsyncSocket: https://github.com/robbiehanson/CocoaAsyncSocket Любая идея? – Eddy
Вы действительно должны избегать глобального состояния. Просто передайте экземпляр «AsyncSocket» другим объектам, которые в нем нуждаются. Читайте об инъекции зависимостей: http://en.wikipedia.org/wiki/Dependency_injection – Sven