2014-01-26 28 views
0

我有一個類,它有一些只能在類中使用的方法。存在這些方法,因爲我有三個步驟對圖形工作我做,但我只想類的實例來訪問這些計算的最終結果,在一個簡單的例子:如何編寫只能在類中使用並能夠訪問ivars的方法

#import <Foundation/Foundation.h> 

@interface GraphicsWorld : NSObject 

@property(nonatomic, strong) NSMutableArray *objects; 
@property(nonatomic, strong) NSMutableArray *adjustedObjects 

/* three methods I'll never use outside of this class 

I want to find a way to get replace these methods. 
*/ 
-(void) calcTranslation; 
-(void) calcRotation; 
-(void) calcPerspective; 

/* the one method I'll use outside of this class */ 
-(NSMutableArray *) getAdjustedObjects; 

@end 

我可以定義C函數外面我實現這個的,但他們不會訪問屬性:

#import <Foundation/Foundation.h> 
#import "GraphicsWorld.h" 

void calcTranslation() 
{ 
    // I'm useless because I can't access _objects. 
} 

void calcRotation() 
{ 
    // Hey, me too. 
} 

void calcPerspective() 
{ 
    // Wow, we have a lot in common. 
} 

@implementation GraphicsWorld 

-(NSMutableArray *) getAdjustedObjects 
{ 
    calcTranslation(); 
    calcRotation(); 
    calcPerspective(); 

    return adjustedObjects; 
} 

@end 
+0

@bbum這肯定是。 – michaelsnowden

回答

0

除非我誤解了你的問題,這聽起來像你只是想隱藏你的方法不被公開?如果是這樣,只需從標題中刪除它們。您不再需要在objc(Xcode)中預先聲明方法。編譯器現在就可以在內部找到它們。

+1

所以我可以將我的方法添加到實現中而不用聲明它們? Whhaaaat。 – michaelsnowden

+0

@doctordoder您從不需要向.h文件添加方法。如果其他類需要訪問方法,則只需將方法添加到.h。 – rmaddy

+0

我喜歡在.m – bbum

0
  1. 使C風格的函數(如你所示)帶參數和返回值。
  2. 製作私有的Objective-C風格的方法。

除了在.h文件的@implementation部分,你也可以有一個在你的.m文件,這是私人的。就像您在.h文件的@implementation中聲明方法和屬性一樣,您可以在.m中執行相同的操作。

+0

>製作帶有參數和返回值的C樣式函數(如您所示)。那麼,這是行不通的,因爲那樣我就無法訪問我的ivars;除非,你是在暗示我將我的ivars作爲參數傳遞給這些方法。你是?我考慮過這個,但是我想知道這是不是好的做法。 – michaelsnowden

+0

如果你正在談論'objects'和'adjustedObjects',它們具有公共訪問器,並且可以通過將'self'傳遞給函數來訪問它們。如果你正在討論的實例變量不是公有的,你可以將它們作爲參數傳遞。 – nhgrif

0

可以調用一個方法,不管它是否聲明爲private,也可以不放在頭文件中;由於Objective-C隱藏方法的性質很難。

隱藏功能要容易得多,只需將它們聲明爲static即可。要訪問當前實例,只需傳入一個對它的引用 - 即Objective-C在幕後執行的操作。

因此,例如:

void calcTranslation(GraphicsWorld *self) 
{ 
    // Access properties, instance variables, call instance methods etc. 
    // by referencing self. You *must* include self to reference an 
    // instance variable, e.g. self->ivar, as this is not a method the 
    // self-> part is not inferred. 
} 

,並把它稱爲:

-(NSMutableArray *) getAdjustedObjects 
{ 
    calcTranslation(self); 
    ... 
+0

這幾乎從未做過,通過'self->訪問ivars真的沒有做過。只需使用類擴展,聲明方法並完成它。 – bbum

+0

@bbum - 兩者都完成了,如果它滿足需要,它沒有任何問題。然而,簡單地不公開方法(使用或不使用擴展)適合更普遍的需求。課程的馬匹。 – CRD

+2

不遵循約定並採用沒有明顯優勢的新模式會導致難以維護且難以重構的代碼庫。在爲項目增加新人時,這也會帶來巨大的成本。 – bbum

相關問題