在类方法,目标C中访问的实例变量

时间:2012-05-08 14:48:26

标签: iphone objective-c class-method

这是我收到此错误时的原始代码

ClassA.h

  

+(ClassA的*)了methodA:(NSData的*)的数据;

@property (nonatomic, strong) NSMutableArray    *arr; 
@property (nonatomic, strong) RXMLElement     *rxmlRoot; 
     

@end

ClassA.m

  

+(ClassA *)methodA:(NSData *)data {

//NSLog(@"class is %@",[name class]);
ClassA *ClassA   =   [[Stores alloc] init];
arr        =   [NSMutableArray array];
rxmlRoot   = [RXMLElement elementFromXMLData:data];
     

}

我正在审核我的代码,现在我有两个选项来修复代码

OptionA

  

ClassA.h

+(ClassA*)methodA:(NSData*)data;

@property (nonatomic, strong) NSMutableArray    *arr; 
@property (nonatomic, strong) RXMLElement     *rxmlRoot; 

@end
     

ClassA.m

+(ClassA*)methodA:(NSData*)data {

//NSLog(@"class is %@",[name class]);
ClassA *ClassA   =   [[Stores alloc] init];
ClassA.arr        =   [NSMutableArray array];             <----- this has been modified
ClassA.rxmlRoot   = [RXMLElement elementFromXMLData:data];<----- this has been modified

}

OptionB

  

ClassA.h

+(ClassA*)methodA:(NSData*)data;

@end
     

ClassA.m

static RXMLElement    *rxlRoot; <----- this has been added as class variable
static NSMutableArray *arr;     <----- this has been added as class variable

+(ClassA*)methodA:(NSData*)data {

//NSLog(@"class is %@",[name class]);
ClassA *ClassA   =   [[Stores alloc] init];
arr        =   [NSMutableArray array];             
rxmlRoot   = [RXMLElement elementFromXMLData:data];
     

}

我尝试使用optionA或optionB,编译器不会抱怨任何内容,代码也能正常工作。

我在optionB后面看到许多帖子,它们创建了类变量。

问题:当我们处理类方法和类变量时,optionA也是一个很好的方法。

请就此问题向我提出建议,顺便说一下如果我在某个地方犯了错误,请纠正我。感谢

2 个答案:

答案 0 :(得分:2)

Objective-C中没有“类变量”这样的东西。当您将变量声明为static时,它实际上是一个全局变量,它仅限于在其中编译的文件的范围或方法/函数(或子表达式)的范围。

摆脱调用的Class.部分来设置变量;这只适用于Class的.m文件;这通常是你想要的模式(通常不鼓励真正的全局变量 - 尽管有时很有用)。

答案 1 :(得分:1)

使用data参数创建指定的初始值设定项。每个班级都应该有一个指定的初始化程序。

在您的类方法中,调用传入data

的指定初始值设定项

以下是示例代码:

//ClassA.h
@class RXMLElement;

@interface ClassA : NSObject
+(ClassA*)methodA:(NSData*)data;
-(id)initWithData:(NSData*)data;

@property (nonatomic, strong) NSMutableArray *arr; 
@property (nonatomic, strong) RXMLElement    *rxmlRoot; 

@end

//ClassA.m
@implementation ClassA
@synthesize arr;
@synthesize rxmlRoot;

+(ClassA*)methodA:(NSData*)data {
    return [[ClassA alloc] initWithData:data];
}

-(id)initWithData:(NSData*)data {
    self = [super init];
    if (self) {
        arr      = [NSMutableArray array];
        rxmlRoot = [RXMLElement elementFromXMLData:data];
    }
    return self;
}
@end

示例中假设了ARC。