【问题标题】:Creating class extension for a Class's private methods为类的私有方法创建类扩展
【发布时间】:2013-07-02 22:54:05
【问题描述】:

我创建了一个游戏模型作为一个类。我检查了这个关于创建类扩展的问题:Best way to define private methods for a class in Objective-C

我拥有的是一些公共方法——这些方法可供其他 VC 在应用程序中使用。 我还想要一些私有方法,类公共方法可以使用,但不需要对应用程序的其余部分开放。

我认为这可以通过类扩展来实现,在实现文件中添加一个额外的接口部分,但这似乎不起作用。

Imp 文件:

#import "MESGameModel.h"

@interface MESGameModel ()

-(BOOL)checkIfGameAlreadyExistsAgainst:(PFUser *)opponentUser;

@end

@implementation MESGameModel

#pragma mark - Public methods
+(void)createNewGameAgainst:(PFUser *)user2 withCompletion:(void (^)(BOOL success))completionHandler{

稍后我有另一个私有方法的声明:

#pragma mark - Private methods
-(BOOL)checkIfGameAlreadyExistsAgainst:(PFUser *)opponentUser {

我正在寻找的是能够在公共方法 (createNewGameAgainst) 中调用例如 [self checkIfGameAlreadyExistsAgainst...]。

【问题讨论】:

  • 顺便说一句:从 XCode 4.3 附带的 LLVM 开始,您不必再转发声明私有方法了。
  • 这是否意味着不需要实现文件中的整个接口部分,如果头文件中没有定义,它会自动将其作为私有方法提取?
  • 可以,但仅限 Xcode 4.3 及更高版本
  • @StuartM 我可能会扯淡,但是,不,这并不意味着“不需要实现文件中的整个接口部分”。这只是意味着您不必转发声明私有方法。但是,您仍然在私有类扩展中定义您的私有属性。如果您没有私有属性(就像这里的情况一样),那么您不需要私有类扩展。但是类扩展非常有用;但对于私有财产来说,这比什么都重要。

标签: ios objective-c ios5 methods class-extensions


【解决方案1】:

您可以使用表格;您的问题是了解类方法与实例方法的区别。

+ (void)createNewGameAgainst:(PFUser *)user2 withCompletion:(void (^)(BOOL success))completionHandler

是一个类方法(注意'+')——你不需要MESGameModel的实例来调用这个方法。但是,在该类方法的定义(或主体)中,您将没有 MESGameModel 的实例。您不能使用 MESGameModel 的实例方法、属性或 ivars,因为类方法中不存在 MESGameModel 的实例。

self 在这个范围内将是一个特殊的类,您可以发送消息但响应类方法。

- (BOOL)checkIfGameAlreadyExistsAgainst:(PFUser *)opponentUser;

声明一个实例方法(注意'-')。 MESGameModel 的实例可能会响应此消息,并且在该方法的定义中,您将可以访问 MESGameModel 的实例变量、属性、实例方法和类方法。

self 将是 MESGameModel 的一个实例,您可以发送消息并响应实例方法。

【讨论】:

  • 谢谢,我接受了第一个答案,因为这解释了同一点,但已经投了赞成票。你是对的。在我的情况下,这不是一个类,因为它只是一个 NSObject 并用作垃圾场以放置与游戏(部分)关联的所有方法。
  • @StuartM 这很公平 - 达尼洛在我之前回答了。当我回答时,我只是没有看到他的答案,我的帖子添加了一些细节。所以补充信息似乎很好。不客气
【解决方案2】:

您的createNewGameAgainst 方法是一个类方法(参见方法声明前面的+)。您的checkIfGameAlreadyExistsAgainst 方法是一个实例方法(参见方法声明前面的-)。要从createNewGameAgainst 调用checkIfGameAlreadyExistsAgainst,您需要获取MESGameModel 的实例。 self 内部的 createNewGameAgainst 引用类本身,而不是它的实例。

【讨论】:

  • 好的,因为我将此设置作为 NSObject 并且不是这样的模型,而是与游戏部分相关联的方法的倾销场...我应该将第二种方法更改为类方法,因为它与应用程序中其他地方可用的方法没有区别。
  • 这也有效。如果您将checkIfGameAlreadyExistsAgainst 更改为类方法(+),那么您可以使用createNewGameAgainst 中的[self checkIfGameAlreadyExistsAgainst
猜你喜欢
  • 2011-12-06
  • 2014-11-22
  • 2018-07-08
  • 1970-01-01
  • 2011-07-09
  • 2019-03-05
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多