Xcode 如何使AppDelegate中声明的GCDAsyncSocket可用于查看控制器

Xcode 如何使AppDelegate中声明的GCDAsyncSocket可用于查看控制器,xcode,ios5,gcdasyncsocket,appdelegate,Xcode,Ios5,Gcdasyncsocket,Appdelegate,在一篇类似问题的帖子之后(这不起作用),我在AppDelegate.h上声明了GCDAsyncSocket的一个实例 #import <UIKit/UIKit.h> @class ViewController; @class GCDAsyncSocket; @interface AppDelegate : UIResponder <UIApplicationDelegate> { GCDAsyncSocket *asyncSocket; } @proper

在一篇类似问题的帖子之后(这不起作用),我在AppDelegate.h上声明了GCDAsyncSocket的一个实例

#import <UIKit/UIKit.h>

@class ViewController;
@class GCDAsyncSocket;

@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
    GCDAsyncSocket *asyncSocket;

}

@property (strong, nonatomic) UIWindow *window;
@property (nonatomic, retain) GCDAsyncSocket *asyncSocket;
@property (strong, nonatomic) ViewController *viewController;

@end
我试图通过调用以下命令从多个视图控制器访问套接字:

GCDAsyncSocket *asyncSocket = [[[UIApplication sharedApplication] delegate] asyncSocket];
代码完成在[[UIApplication sharedApplication]委托]处停止,但无法建议使用asyncSocket。 在AppDelegate中声明asyncSocket实例时,我应该如何使asyncSocket在多个视图控制器中可访问?谢谢


这是我的Xcode项目文件:

您走对了方向。应用程序委托是套接字连接的好地方。我想你被一些相对简单的事情绊倒了

[[UIApplication sharedApplication]委托]
返回一个
id
或通用对象指针,指向符合
协议的对象。因此,代码完成无法知道应用程序的委托是
AppDelegate
类的实例

请记住,如果您实际上正在使用
AppDelegate
的实例作为应用程序的委托,则
[[UIApplication sharedApplication]委托]
将返回指向委托的指针,但它将是上面讨论的通用指针

最简单的解决方案是将从
[[UIApplication sharedApplication]delegate]
收到的指针转换为
AppDelegate
类型的指针

例如:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
// We now have a pointer to your app delegate that the compiler knows is an AppDelegate.
// So code completion will work and it will compile.
GCDAsyncSocket *socket = [myAppDelegate asyncSocket];
也可以将调用堆叠到一个语句。语法看起来有点古怪,但就是这样做的

GCDAsyncSocket *socket = [(AppDelegate *)[[UIApplication sharedApplication] delegate] asyncSocket];
GCDAsyncSocket *socket = [(AppDelegate *)[[UIApplication sharedApplication] delegate] asyncSocket];