如何将 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的主要内容,如果未能解决你的问题,请参考以下文章

AsyncSocket 在 iPad 的睡眠模式下崩溃

AsyncSocket 延迟发送数据

iOS--(转)socket编程之Asyncsocket详解

AsyncSocket/GCDAsyncSocketis 的哪一部分是关于异步的?

AsyncSocket 和通知 - 内存泄漏

如何检测 ASyncSocket 中的远程断开连接