Ошибка доступа к свойству члена класса, который является свойством другого класса - PullRequest
0 голосов
/ 17 августа 2011

Вот первый класс:

@interface ClassA : NSObject {

NSMutableArray* array1;
NSArray* array2;

}

@property (nonatomic, assign)NSMutableArray* array1;
@property (nonatomic, assign)NSArray* array2;

-(id) initWithData:(NSString*)string1 andWords:(NSString*)string2;

@end

@implementation ClassA

@synthesize array1;
@synthesize array2;

-(id) initWithData:(NSString*)string1 andWords:(NSString*)string2
{
if ((self = [super init]))
{
    array1 = [[NSMutableArray alloc] initWithCapacity:[string1 length]];
    for (int i=0; i < [array1 length]; i++)
        [array1 addObject:[NSString stringWithFormat:@"%c", [string1 characterAtIndex:i]]];

    array2 = [string2 componentsSeparatedByString:@";"];

    NSLog(@"array1 = %@", array1);
    NSLog(@"array2 = %@", array2);
}
return self;
}

- (void) dealloc
{
[array1 release];
[array2 release];

[super dealloc];
}

@end

Вот второй класс:

@interface ClassB : NSObject {

ClassA* classA;
}

@property (nonatomic, assign)ClassA* classA;

У меня проблемы с получением доступа к свойствам ClassA, которые хранятся в ClassB.

Например, я хочу сделать что-то вроде:

// print out the arrays stored in Class B 
NSLog(@"%@",[[classB classA] array1]);
NSLog(@"%@",[[classB classA] array2]);

array1 печатает нормально, но выдает array2 и выдает ошибку EXC_BAD_ACCESS.Я предполагаю, потому что

array2 = [string2 componentsSeparatedByString:@";"]; 

распределяется неправильно.

Ответы [ 3 ]

3 голосов
/ 17 августа 2011

Apple гораздо проще разрешить управление памятью: измените свойства array1 и array2 с assign на retain, а затем используйте в своем init следующее:

NSMutableArray* newArray1 = [NSMutableArray arrayWithCapacity:[string1 length]];
for (int i=0; i < [array1 length]; i++)
    [array1 addObject:[NSString stringWithFormat:@"%c", [string1 characterAtIndex:i]]];
[self setArray1:newArray1];

[self setArray2:[string2 componentsSeparatedByString:@";"]];

Таким образом, ваши @synthesize d методы установки будут обрабатывать сохранение свойств для вас.

0 голосов
/ 18 августа 2011

Я решил эту проблему, сначала вызвав alloc:

array2 = [NSArray alloc];
array2 = [string2 componentsSeparatedByString:@";"]; 
0 голосов
/ 17 августа 2011

Я полагаю, что array2 автоматически высвобождается, потому что вы создаете его с помощью одного из удобных методов NSString, а не явно выделяете массив. Попробуйте сохранить результаты вместо того, чтобы просто установить iVar на автоматически выпущенную строку.

...