如何将 AsyncSocket 实例声明为 Global
Posted
技术标签:
【中文标题】如何将 AsyncSocket 实例声明为 Global【英文标题】:How to declare AsyncSocket instance as Global 【发布时间】:2010-09-21 11:38:59 【问题描述】:我正在为聊天应用程序使用 AsyncSocket 类。但我想为整个项目使用在登录页面中创建的 AsyncSocket 实例。这意味着我想重用在登录页面中为 chatViewControl 类创建的 AsyncSocket 实例。 谁能帮我找到解决方案?
【问题讨论】:
你真的应该避免全局状态。只需将AsyncSocket
实例传递给需要它的其他对象。阅读依赖注入:en.wikipedia.org/wiki/Dependency_injection
【参考方案1】:
如果您希望在应用程序范围内引用单个 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:github.com/robbiehanson/CocoaAsyncSocket 有什么想法吗?【参考方案2】:您应该尽可能避免使用全局状态(请参阅 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:...];
【讨论】:
确实应该避免全局状态,所以这不是一个好主意。不经常这样做是有原因的。 这是我的意图,但我想我没有很好地传达它 - 我已经重新排序/改写了我的答案以使其更清楚。以上是关于如何将 AsyncSocket 实例声明为 Global的主要内容,如果未能解决你的问题,请参考以下文章
iOS--(转)socket编程之Asyncsocket详解