2013-02-01 148 views
0

我有一個類方法這需要一個數組作爲消息被髮送到該方法從外部的ViewController與陣列的值的參數如何訪問類方法?

+(void)classMethod:(NSArray*)array; 

[ViewController classMethod:ValueofArray] 

現在我想從一個實例方法訪問同一的ViewController該數組的值作爲類方法

-(void)instanceMethod; 

如何可能?

回答

1

您寫道:

現在我想從一個實例方法訪問相同的ViewController該數組的值作爲類方法

但類方法的一點是,它不是該類的一個實例。當您不需要查看任何類的變量或屬性時,可以使用類方法。例如,像[MyClass countVowels:someString];這樣的方法可以在沒有任何「狀態」的情況下執行其操作,因此它可以是類方法的候選者。

在另一方面,如果你寫「[myClass countVowels];」這意味着這樣的事情:

MyClass * myClass = [[MyClass alloc] initWithString:@"some string]]; 
int howMany = [myClass countVowels]; 

這第二版大概會保存傳遞給init方法的字符串,後來又算元音在該字符串。

希望有所幫助。

+0

我對這個答案百感交集。在這種情況下,一個類方法確實可以執行一個函數(按照你提到的例子),但沒有理由不能用它來設置(或遞增/遞減)共享靜態變量。 –

+0

非常真實,但這應該留給那些知道如何做到這些以及所有這些代碼的後果的人們。我很想提到單身人士的常見情況;或者靜態方法如何獲取該類的'sharedInstance';但不想讓他失望那個兔子洞。 ;) – Dave

0

您可以在類的頭和實現之外創建靜態類變​​量。

下面是一個例子:

// MyClass.h 

@interface MyClass : NSObject 
+ (void)setClassArray:(NSArray *)array; 
+ (NSArray *)classArray; 
@end 


// MyClass.m 

#import "MyClass.h" 

static NSArray *_myClassArray; 

@implementation MyClass 

+ (NSArray *)classArray 
{ 
    return _myClassArray; 
} 

+ (void)setClassArray:(NSArray *)array 
{ 
    if (_myClassArray != array) 
    { 
     _myClassArray = array; 
    } 
} 

@end 

因此,你會設置類陣列的這樣的值:

[MyClass setClassArray:[NSArray arrayWithObject:@"Some_Objects"]]; 

在類的一個實例,你可以這樣訪問:

- (void)myInstanceMethod 
{ 
    // setting to another ivar is optional and only shown for clarity 

    NSArray *array = _myClassArray; 
    // ... do whatever you want to do with it here... 
} 
0

確實,類方法通常(而且應該是)無狀態的函數實體,wha你正在尋找是可能的。在這種情況下,有一個數組MyViewController想要使用的所有實例,所以其他類設置該信息只是不在乎。

MyViewController.m 

static NSArray *staticArray; 

+ (void)aClassMethod:(NSArray *)array 
{ 
    staticArray = array; 
} 

- (void)anInstanceMethod 
{ 
    NSLog(@"My staticArray: %@", staticArray); 
} 

所有這一切說,這是一個非常具體和非標準的情況。您可能會重新考慮您的使用案例,或許您確實需要委託模式,默認單例如[NSNotificationCenter defaultCenter]或其他。或者你實際上有一個很好的用例。尼斯。

無論如何,你有它。

2

您將不得不創建一個靜態類級別變量來保存該值。

例如:

@implementation SOMyObject 

static NSArray *thisArray; 


+(NSArray*) thisArray 
{ 
    return thisArray; 
} 

+(void) myMethod:(NSArray*) array; 
{ 
    thisArray = array; 
} 

-(void) doWork 
{ 
    //[SOMyObject thisArray] 
} 

@end 
+0

+1,方便又好的答案.. –