2012-05-08 14 views
2

私はこのエラーインスタンス化変数対物C

ClassA.h

+(A級*)methodA取得していたときにこれは、元のコードである:(NSDataの*)データを、

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

@end

ClassA.m

+(A級*)methodA(のNSData *)データ{

//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 

} 

オプションB

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のいずれかを試してみて、コンパイラは何もしてコードを文句はありません正しく機能します。

クラス変数を作成するオプションBの後には、多くの投稿があります。

質問:optionAも、クラスメソッドとクラス変数を扱うときに従うと良い方法です。

私はどこかで間違いを犯した場合は、この問題と方法でアドバイスをしてください、私を修正してください。ありがとう

+0

それを指摘してくれてありがとう。私は店舗をClassAに変更しました – tranvutuan

答えて

1

データパラメータで指定された初期化子を作成します。すべてのクラスには、指定された初期化子が必要です。

クラスメソッドでは、指定された初期化子を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を例に仮定される:ここ

は、サンプルコードです。

+0

問題は+(ClassA *)になりました。これはすべてrxmlRootという名前のvarにアクセスします – tranvutuan

+1

クラスメソッドはインスタンス変数に設計上アクセスできません。インスタンス。必要なものを渡してください。一般的なメソッドは、「スタンドアロン」でない限り、クラスメソッドにするべきではありません。あなたは何を達成しようとしていますか? – zaph

+0

+(ClassA *)メソッドA:(NSData *)データ{ ClassA * classA = [[ClassA alloc] initWithData:data]; [arr addObject:nameOfAnObject];クラスAを返す } 。ただし、rxmlRootという名前のvarにはアクセスできません。 – tranvutuan

2

Objective-Cには「クラス変数」はありません。変数をstaticと宣言すると、コンパイルされるファイルのスコープまたはメソッド/関数(またはサブ式)のスコープのいずれかに限定されるグローバル変数となります。

変数を設定する呼び出しの一部を取り除きます。クラスのために.mファイルでのみ動作します。これは一般的にあなたが望むパターンです(本当にグローバル変数は一般的に推奨されませんが、時には役に立ちます)。

関連する問題