Iphone Objective将类指针传递到静态库,然后从类调用方法

Iphone Objective将类指针传递到静态库,然后从类调用方法,iphone,ios,objective-c,Iphone,Ios,Objective C,您好,谢谢您的帮助。我试着寻找,但似乎我尝试做的是不常见的。如果有其他帖子谈论我的问题,请链接 首先,我有两门课。为了保持名称简单,一个名为控制器,另一个名为我的AppDelegate。控制器是一个静态库。AppDelegate使用以下命令创建控制器的实例 *注意:我已经在.h文件中声明了_controller _controller = [[Controller alloc] initWithAppDelegate:self]; 我想做的是从控制器调用AppDelegate类中的方法。co

您好,谢谢您的帮助。我试着寻找,但似乎我尝试做的是不常见的。如果有其他帖子谈论我的问题,请链接

首先,我有两门课。为了保持名称简单,一个名为控制器,另一个名为我的AppDelegate。控制器是一个静态库。AppDelegate使用以下命令创建控制器的实例

*注意:我已经在.h文件中声明了_controller

_controller  = [[Controller alloc] initWithAppDelegate:self];
我想做的是从控制器调用AppDelegate类中的方法。controller.h类中的相关代码如下所示

@interface
{
  id _appDelegate;
}

-(id) initWithAppDelegate:(id)appDelegate;
在controller.m中

-(void)someMethodName
{
  [_appDelegate method];
}
我遇到的问题是无法调用该方法。我可以调用其他几个方法,但不能调用我在AppDelegate中创建的自定义方法。我尝试过用AppDelegate替换ID,但我似乎无法导入AppDelegate,我有点理解为什么无法导入它

我以这种方式创建项目的原因是,我希望在具有为不同设备设计的UI的应用程序中重用控制器代码。如果有任何不清楚或您需要更多信息,请随时询问


谢谢

在静态库中声明如下协议:

@protocol AppDelegateRequiredMethods
@required
... methods here ...
@end
然后,将声明该协议的标头导入到各种AppDelegate实现中,并将您的AppDelegate声明为实现所述协议:

@interface MyAppDelegate:NSObject <AppDelegateRequiredMethods>
...
@end
@接口MyAppDelegate:NSObject
...
@结束

控制器不知道应用程序委托或其方法。必须使用协议声明接口

@protocol AppDelegateMethods
- (void)method;
@end

//Then replace your current id with     
id <AppDelegateMethods>
@协议AppDelegateMethods
-(b)方法;
@结束
//然后将当前id替换为
身份证件

如您所述使用
id
会增加代码的脆弱性,因为您削弱了编译器确保应用程序委托实现方法的能力。应用程序委托应该声明为符合协议,这样编译器才能正确验证实现。@bbum修复了它,即使它没有被称为相同的idea@bbum,该部分指控制器代码。。我看不出问题所在,事实上,你对自己答案的评论暗示了同样的事情。不,这些评论并不意味着同样的事情。@wain建议的强烈类型是
\u appDelegate
本身,这与将协议应用于类声明本身无关。在您的代码中,如果应用程序委托未实现方法,编译器不会发出警告。@bbum这也是我在回答中建议的。如果您引用的是
@required
,则默认为隐式默认。一旦您使用了协议,您将更改属性/实例变量和初始化方法:
id\u appDelegate
-(id)initWithAppDelegate:(id)appDelegate太棒了,我相信这会奏效。一旦我有更多的时间来实施,我将标记为已回答。@Wain,感谢您为清晰起见添加了额外的信息。这个解决方案对我非常有效。