Objective c 在课堂上使用自我教学法
我在ShareKit中遇到了这段代码,我不明白作者的想法,在类方法中使用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 =
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
,因此执行时没有错误
如果代码符合您描述的标准,那么我仍然不清楚为什么会收到警告
我描述的标准适用于执行,但它偏离了语言的语义——因此,编译器在这方面是绝对正确的
为了解决这个问题:没有办法告诉编译器“我的类实例符合协议”,因为采用声明适用于类的实例
您有两个主要选项:
+ (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]];