如何访问Class方法?

时间:2013-02-01 03:55:45

标签: ios objective-c nsmutablearray nsarray class-method

我有一个类方法,它将Array作为参数

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

正在从具有数组值的外部ViewController向此方法发送消息。

[ViewController classMethod:ValueofArray]

现在我想从与Class方法相同的ViewController中的实例方法访问该数组的值

-(void)instanceMethod;

这怎么可能?

4 个答案:

答案 0 :(得分:2)

您必须创建一个静态类级别变量来保存该值。

例如:

@implementation SOMyObject

static NSArray *thisArray;


+(NSArray*) thisArray
{
    return thisArray;
}

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

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

@end

答案 1 :(得分:1)

您写道:

  

现在我想从与Class方法相同的ViewController中的实例方法访问该数组的值

但是类方法的意义在于它不是类的实例。当您不需要查看类的任何变量或属性时,可以使用类方法。例如,像[MyClass countVowels:someString];这样的方法可以在没有任何“状态”的情况下执行其操作,因此它可以是类方法的候选者。

另一方面,如果你写“[myClass countVowels];”,它意味着这样的事情:

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

第二个版本可能存储传递给init方法的字符串,然后计算该字符串中的元音。

希望有所帮助。

答案 2 :(得分: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...
}

答案 3 :(得分:0)

确实,类方法通常(并且应该是)无状态功能实体,您正在寻找的是可能的。在这种情况下,有一个单独的数组,MyViewController的所有实例都想使用,所以其他类设置该信息并不关心。

MyViewController.m

static NSArray *staticArray;

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

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

所有这一切,这是一个非常具体和非标准的案例。您可能需要重新考虑您的用例,也许您实际上需要委托模式,默认单例如[NSNotificationCenter defaultCenter]或其他。或者你实际上有一个很好的用例。好的。

无论如何,你有它。