我有一个类方法,它将Array作为参数
+(void)classMethod:(NSArray*)array;
正在从具有数组值的外部ViewController向此方法发送消息。
[ViewController classMethod:ValueofArray]
现在我想从与Class方法相同的ViewController中的实例方法访问该数组的值
-(void)instanceMethod;
这怎么可能?
答案 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]
或其他。或者你实际上有一个很好的用例。好的。
无论如何,你有它。