Ios 转换为圆弧--解析正向引用

Ios 转换为圆弧--解析正向引用,ios,objective-c,Ios,Objective C,我继承了将要迁移到ARC的Objective-C代码。我有许多.h文件,它们声明了一个协议和一个相互引用的接口,.h文件中的基本模式如下 @class BasicService; @class BasicServiceObserver; @protocol BasicServiceObserver -(void)UPnPEvent:(BasicService*)sender events:(NSDictionary*)events; @end @interface BasicService

我继承了将要迁移到ARC的Objective-C代码。我有许多.h文件,它们声明了一个协议和一个相互引用的接口,.h文件中的基本模式如下

@class BasicService;
@class BasicServiceObserver;

@protocol BasicServiceObserver
-(void)UPnPEvent:(BasicService*)sender events:(NSDictionary*)events;
@end


@interface BasicService : NSObject <Events_Observer> {
    <<var declarations here>>
}

-(NSUInteger)addObserver:(BasicServiceObserver*)obs;
-(NSUInteger)removeObserver:(BasicServiceObserver*)obs;
-(BOOL)isObserver:(BasicServiceObserver*)obs;
@end
@class基本服务;
@类BasicServiceObserver;
@协议基本服务观察服务器
-(void)UPnPEvent:(BasicService*)发送方事件:(NSDictionary*)事件;
@结束
@接口基本服务:NSObject{
}
-(NSUInteger)addObserver:(BasicServiceObserver*)obs;
-(NSUInteger)removeObserver:(BasicServiceObserver*)obs;
-(BOOL)isObserver:(BasicServiceObserver*)obs;
@结束
在.m文件中,BasicServiceObserver ref被标记为前向引用。.m文件包括上述.h文件

//Events_Observer
-(void)someEvent:(NSDictionary*)events{
    BasicServiceObserver *obs = nil;

    [mMutex lock];
    NSEnumerator *listeners = [mObservers objectEnumerator];
    while(obs = [listeners nextObject]){
        [obs someEvent:self events:events]; // <-- Receiver type 'BasicServiceObserver' for instance message is a forward declaration
    }
    [mMutex unlock];
}
//事件\u观察者
-(void)someEvent:(NSDictionary*)事件{
BasicServiceObserver*obs=nil;
[mMutex锁];
NSEnumerator*侦听器=[mObservers objectEnumerator];
while(obs=[listeners nextObject]){

[obs someEvent:自我事件:事件]由于
BasicServiceObserver
是一个协议,而不是一个类,因此在这种情况下不应该向前声明它。将它声明为
@class
会误导编译器,使其认为在没有此类接口的情况下,某个地方会有一个
@interface BasicServiceObserver

以下是您应该如何使其达到编译状态:

@class BasicService;

@protocol BasicServiceObserver
-(void)UPnPEvent:(BasicService*)sender events:(NSDictionary*)events;
@end


@interface BasicService : NSObject <Events_Observer> {
    <<var declarations here>>
}

-(NSUInteger)addObserver:(id<BasicServiceObserver>)obs;
-(NSUInteger)removeObserver:(id<BasicServiceObserver>)obs;
-(BOOL)isObserver:(id<BasicServiceObserver>)obs;
@end
@class基本服务;
@协议基本服务观察服务器
-(void)UPnPEvent:(BasicService*)发送方事件:(NSDictionary*)事件;
@结束
@接口基本服务:NSObject{
}
-(整数)addObserver:(id)obs;
-(整数)removeObserver:(id)obs;
-(BOOL)服务器:(id)obs;
@结束
类似地,在.m文件中

//Events_Observer
-(void)someEvent:(NSDictionary*)events{
    id<BasicServiceObserver> obs = nil;

    [mMutex lock];
    NSEnumerator *listeners = [mObservers objectEnumerator];
    while(obs = [listeners nextObject]){
        [obs someEvent:self events:events]; // <-- Receiver type 'BasicServiceObserver' for instance message is a forward declaration
    }
    [mMutex unlock];
}
//事件\u观察者
-(void)someEvent:(NSDictionary*)事件{
id obs=零;
[mMutex锁];
NSEnumerator*侦听器=[mObservers objectEnumerator];
while(obs=[listeners nextObject]){

[obs someEvent:self events:events];//正如其他人所指出的,类和协议不是一回事

有时您确实希望同时定义这两种协议,例如系统UITableView类和UITableViewDelegateProtocol协议

如果要同时拥有协议和类,我建议在协议名称中添加protocol一词:

@protocol BasicServiceObserverProtocol
-(void)UPnPEvent:(BasicService*)sender events:(NSDictionary*)events;
@end
但是,最好不要创建BasicServiceObserver类,而是使所有指向对象的指针都符合该协议


BasicServiceObserver协议,正如@DasLinkenlight在他的帖子中所说。

这是无效的:
BasicServiceObserver*obs=nil;
。它应该是;
id obs=nil;
。如果你在下面声明它,你不必设置
@class BasicServiceObserver;
。而且,
BasicServiceObserver
不是一个类,所以你不能使用它
@class
另外,作为提示,如果您只是将文件移动到ARC以将项目设置为ARC,也可以有选择地禁用特定文件的ARC。