2013-07-04 79 views
0

我已經創建了一個類模型作爲遊戲模型。我檢查了關於創建類擴展的這個問題:Best way to define private methods for a class in Objective-C爲類的私有方法創建類擴展

我所擁有的是一些公共方法 - 這些方法可用於其他VC在應用程序中使用。 我也想要一些私有方法,類public方法可以使用,但不需要對其他應用程序開放。

我想這可能是由類擴展來完成,增加在實現文件中額外的接口部分,但這似乎並沒有工作。

進出口文件:

#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 { 

我所尋找的是叫例如[自checkIfGameAlreadyExistsAgainst的能力.. 。]在公共方法(createNewGameAgainst)內。

+1

順便說一句:由於LLVM附帶的XCode 4.3,你不必轉發聲明私有方法了。 – Danilo

+0

這是否意味着實現文件中的整個接口部分是不需要的,並且如果未在頭文件中定義,它會自動將其作爲私有方法提取? – StuartM

+1

是的,但只有4.3的Xcode和更高 – Danilo

回答

1

createNewGameAgainst方法是一個類方法(參見方法聲明前面的+)。您的checkIfGameAlreadyExistsAgainst方法是一種實例方法(請參閱方法聲明前面的-)。要從createNewGameAgainst呼叫checkIfGameAlreadyExistsAgainst,您需要獲得MESGameModel的實例。 self裏面的createNewGameAgainst引用了類本身,而不是它的一個實例。

+0

好的,因爲我有這樣的設置作爲一個NSObject,並不是這樣一個模型,而是與遊戲部分相關的方法的傾倒地......我應該改變第二種方法也是類方法,因爲它沒有區別到應用程序中其他位置可用的方法。 – StuartM

+0

也可以。如果將'checkIfGameAlreadyExistsAgainst'更改爲類方法('+'),則可以使用'createNewGameAgainst'中的[self checkIfGameAlreadyExistsAgainst'。 – Danilo

1

可以使用的形式;你的問題是理解類方法和實例方法的區別。

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

是一個類方法(注意「+」) - 你不需要的MESGameModel一個實例調用此方法。但是,在類方法的定義(或主體)內不會有MESGameModel的實例。您不能使用MESGameModel的實例方法,屬性或ivars,因爲MESGameModel的實例在類方法中不存在。

self在此範圍內將是一個特殊的類,它可以留言,但響應類方法。

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

聲明一個實例方法(注意' - ')。 MESGameModel的一個實例可能會響應此消息,並且在該方法的定義中,您將有權訪問MESGameModel的實例變量,屬性,實例方法和類方法。

self將是MESGameModel一個實例,你可以留言,並響應實例方法。

+0

謝謝,我接受了第一個答案,因爲這解釋了同樣的觀點,但已經投了票。你是對的。在我的情況下,這不是一個類,因爲它只是一個NSObject,並被用作放置所有與遊戲(節)相關聯的方法的傾倒場。 – StuartM

+0

@StuartM這很公平 - 達尼洛在我做之前回答。當我回答時,我只是沒有看到他的回答,而我的帖子又添加了一些細節。所以對於補充信息似乎很好。別客氣 – justin