Objective c 在课堂上使用自我教学法

Objective c 在课堂上使用自我教学法,objective-c,class-design,class-method,objc-protocol,Objective C,Class Design,Class Method,Objc Protocol,我在ShareKit中遇到了这段代码,我不明白作者的想法,在类方法中使用self。警告:不兼容的指针类型将“Class”发送到参数类型id我想清除这些警告,以便以后可以看到可能会造成伤害的警告。我能/应该做什么才能不打破这个局面? 这是文件SHKFacebook.m,类名是SHKFacebook + (void)logout { FBSession *fbSession; if(!SHKFacebookUseSessionProxy){ fbSession =

我在ShareKit中遇到了这段代码,我不明白作者的想法,在类方法中使用
self
。警告:不兼容的指针类型将“Class”发送到参数类型
id
我想清除这些警告,以便以后可以看到可能会造成伤害的警告。我能/应该做什么才能不打破这个局面?

这是文件SHKFacebook.m,类名是SHKFacebook

+ (void)logout
{
    FBSession *fbSession; 

    if(!SHKFacebookUseSessionProxy){
        fbSession = [FBSession sessionForApplication:SHKFacebookKey
                                                 secret:SHKFacebookSecret
                                               delegate:self];

    }else {
        fbSession = [FBSession sessionForApplication:SHKFacebookKey
                                        getSessionProxy:SHKFacebookSessionProxyURL
                                               delegate:self];
    }

    [fbSession logout];
}

self
可以在类方法中用作多态类实例

因此,类方法
new
可以如下实现:

+ (id)new
{
  return [[self alloc] init];
}
并将返回发送消息的类实例的正确类型:

例a:

在实例方法中,“类的实例”是
self

- (void)foo { self; }
实际上,
-[NSObject conformsToProtocol:
+[NSObject conformsToProtocol:
+[NSObject class]
只返回
self
,因此执行时没有错误

如果代码符合您描述的标准,那么我仍然不清楚为什么会收到警告

我描述的标准适用于执行,但它偏离了语言的语义——因此,编译器在这方面是绝对正确的

为了解决这个问题:没有办法告诉编译器“我的类实例符合协议”,因为采用声明适用于类的实例

您有两个主要选项:

  • 干净、正确的方法:使用类的实例并实现定义的协议

  • 或将类实例类型转换为协议:

    id delegate=(id)self; fbSession=[fbSession sessionForApplication:SHKFacebookKey getSessionProxy:shkFaceBooksSessionProxyURL 代表:代表]

  • 如果选择#2,则定义协议的实例方法以使用类方法可能会有所帮助,如下所示:

    + (void)protocolMethod { /* do stuff */ }
    - (void)protocolMethod { [self.class protocolMethod]; }
    
    这也意味着您永远不需要实例。这会有帮助,因为它会在协议更改时添加警告。当您遵循约定时,这些警告将出现在类方法中

    为了减少噪声,您也可以考虑创建一些方法来将类型转换为一个位置:

    + (id<SomeProtocol>)sharedSomeProtocolDelegate
    {
      return (id<SomeProtocol>)self;
    }
    
    - (id<SomeProtocol>)sharedSomeProtocolDelegate
    {
      return [[self class] sharedSomeProtocolDelegate];
    }
    

    (请注意,这些类型的实现实际上是类集群,您将在调试器中或在打印时看到不同的内容)

    您的编辑清楚了这一点。该协议只包含实例方法,顺便说一句,它们都不引用接收方。如果代码符合您描述的标准,那么我仍然不清楚为什么会收到警告。
    - (void)foo { self; }
    
    + (void)protocolMethod { /* do stuff */ }
    - (void)protocolMethod { [self.class protocolMethod]; }
    
    + (id<SomeProtocol>)sharedSomeProtocolDelegate
    {
      return (id<SomeProtocol>)self;
    }
    
    - (id<SomeProtocol>)sharedSomeProtocolDelegate
    {
      return [[self class] sharedSomeProtocolDelegate];
    }
    
    fbSession = [FBSession sessionForApplication:SHKFacebookKey
                                 getSessionProxy:SHKFacebookSessionProxyURL
                                        delegate:[self sharedSomeProtocolDelegate]];