2010-09-21 23 views
0

我正在爲聊天應用程序使用AsyncSocket類。但我想在整個項目的Login頁面中使用創建的AsyncSocket實例。這意味着我想重用在ChatViewControl類的Login頁面中創建的AsyncSocket實例。 任何人都可以幫助我找到解決方案嗎?如何將AsyncSocket實例聲明爲全局

+0

你真的應該避免全局狀態。只需將'AsyncSocket'實例傳遞給需要它的其他對象。閱讀依賴注入:http://en.wikipedia.org/wiki/Dependency_injection – Sven 2010-09-21 14:15:54

回答

-1

你應該儘可能避免全局狀態(參見Sven的鏈接)。一般來說,你可能更喜歡將某種對象傳遞給其他對象。

例如,我正在處理的當前應用程序我有一個ServerInfo對象,我在創建它之前創建並傳遞給每個新視圖控制器,並且它包含套接字,加密信息,當前消息ID ,用戶名等

然而,要回答如何聲明它作爲一個全球性的問題,你可以做到這一點,就像在C:

在login.h

extern AsyncSocket *g_socket; 

在login.m:

AsyncSocket *g_socket; 

那麼當您創建套接字:

g_socket = [[AsyncSocket alloc] init]; 

,當你想用它在其他文件中:

#import "login.h" 

... 

[g_socket sendData:...]; 
+0

一個真的應該避免全局狀態,所以這不是一個好主意。有一個原因爲什麼這不經常做。 – Sven 2010-09-21 14:16:47

+0

這是我的意圖,但我想我沒有很好地表達 - 我已經對我的答案進行了重新排序/重寫,以使其更清晰。 – JosephH 2010-09-22 01:56:15

2

如果你想有一個應用程序範圍內參照單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]; 
+0

通過將套接字放在AppDelegate中嘗試了您的建議,但是當我嘗試從其他視圖控制器訪問時,套接字方法調用不出來 - > [UIApplication sharedApplication]委託]。我正在使用CocoaAsyncSocket:https://github.com/robbiehanson/CocoaAsyncSocket任何想法? – Eddy 2012-08-28 01:44:33