0

長い質問で申し訳ありませんが、例を使って問題を説明してみてください。

私は3つのオブジェクトを持っています

  1. 疾患
  2. コンパウンド
  3. コムディス

それぞれのクラスに病気と化合物のリストを保存しています。

化合物と疾患の間の関係は Comdis と呼ばれるオブジェクトのリストに格納され、Comdis は (COMPOUND,DISEASE) のペアを格納します。

オブジェクトに格納される情報の例は次のとおりです。

DISEASES
index  acronim  fullname
1        AML,      Acute Myelogenous Leukemia
2        PV,       Polycytemia Vera
3        MF,       Mielofibrosis

COMPOUNDS
index  acronim    fullname
1       LBH589,   Panobinostat
2       INC424,   Ruxolitinib
3       BKM120,   Buparsinib

RELATIONS (COMDIS)
index  disease  compound
1        ( 0   ,    1 )
2        ( 0   ,    2 )
3        ( 0   ,    3 )
4        ( 1   ,    1 )
5        ( 1   ,    2 )
6        ( 1   ,    3 )
7        ( 2   ,    1 )
8        ( 2   ,    2 )
9        ( 2   ,    3 )

私の病気.hは次のようになります。

@interface disease: NSObject
{
    NSString __strong *acronim;
    NSString __strong *fullname;
    int backcolor;
    UIImage __strong *background;
}
@property (nonatomic) int backcolor;
@property (nonatomic, strong) UIImage *background;
@property (nonatomic, strong) NSString *acronim;
@property (nonatomic, strong) NSString *fullname;
@property NSMutableArray *list;
- (id)initWithDiseaseList;
- (int)getIndexByAcronim:(NSString *)acronim;
@end

disease.m には次のコードがあります

#import "disease.h"

@implementation disease

@synthesize acronim, fullname, backcolor, background;

-(id)initWithDiseaseList {
    disease *aml = [[disease alloc] init];
    [aml setAcronim:@"AML"];
    [aml setFullname:@"Acute Myelogenous Leukemia"];
    disease *pv = [[disease alloc] init];
    [pv setAcronim:@"PV"];
    [pv setFullname:@"Polycytemia Vera"];
    disease *mf = [[disease alloc] init];
    [mf setAcronim:@"MF"];
    [mf setFullname:@"Mielofibrosis"];
    NSMutableArray *array = [NSMutableArray array];
    [array addObject:aml];
    [array addObject:pv];
    [array addObject:mf];
    self.list = array;
    return self;
}
- (int)getIndexByAcronim:(NSString *)accr {
    NSArray *array = self.list;
    for(int i = 0; i < [array count]; i++) {
        disease *disease = [array objectAtIndex:i];
        if(disease.acronim == accr) {
            return i;
        }
    }
    return -1;
}
@end

私の Compound.m は、病気のオブジェクトに非常に似ています。

今comdisにリレーションを保存したい。

私のcomdis.hは次のようになります

@interface comdis: NSObject
{
    int *icompound;
    int *idisease;
}
@property (nonatomic,) int *icompound;
@property (nonatomic,) int *idisease;
@property NSMutableArray *list;
- (id)initWithComdisList;
@end

これは私のcomdis.mです

#import "comdis.h"
#import "compound.h"
#import "disease.h"
@implementation comdis
@synthesize idisease, icompound;

- (id)initWithComdisList {
    compound *comp = [[compound alloc] initWithCompoundList];
    disease   *dis = [[disease alloc] initWithDiseaseList];
    NSArray *compoundArray = comp.list;
    NSArray *diseaseArray = dis.list;

    NSMutableArray *array = [NSMutableArray array];
    for(int i = 0; i < [diseaseArray count]; i++) {
        for(int j = 0; j < [compoundArray count]; j++) {
            int iCompoundIndex = [compoundArray indexOfObject:compoundArray[j]];
            int iDiseaseIndex  = [diseaseArray indexOfObject:diseaseArray[i]];
            comdis *com = [[comdis alloc] init];
            [com setIdisease:&iDiseaseIndex];
            [com setIcompound:&iCompoundIndex];
            [array addObject:com];
        }
    }
    comdis *comdisObj = [self.list objectAtIndex:1];
    int idis = *(comdisObj.idisease);
    int icom = *(comdisObj.icompound);

    NSLog(@"%d", idis);
    NSLog(@"%d", icom);    
    return self;
}
@end

問題は、値を印刷しようとした場合、idisまたは指定した値に関係なくicom常に印刷される場合です。loop の値が上書きされているようで、常に loop の最後の値を取ります。2objectAtIndex

長い説明とコードで申し訳ありません。

4

1 に答える 1

1

[com setIdisease:&iDiseaseIndex];すべての comdis オブジェクトのプロパティの病気と化合物は同じアドレスを参照するため、それらはすべて最後に追加されたオブジェクトの値に等しくなります。この問題を解決するには、comdisで*intの代わりにintプロパティを使用できます。

于 2013-03-05T13:14:13.503 に答える