发出访问作为另一个类的属性的类的成员属性的问题

时间:2011-08-17 02:23:57

标签: objective-c properties nsmutablearray nsarray

这是第一堂课:

@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 个答案:

答案 0 :(得分:3)

让Apple为您处理内存管理要容易得多:将array1array2属性从assign更改为retain,然后在init中使用以下内容{1}}:

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 setter方法将处理为您保留属性。

答案 1 :(得分:0)

我相信array2正在自动释放,因为您使用NSString的一种便捷方法创建它,而不是显式分配数组。尝试保留结果,而不是仅仅将iVar设置为自动释放的字符串。

答案 2 :(得分:0)

我首先调用alloc:

解决了这个问题
array2 = [NSArray alloc];
array2 = [string2 componentsSeparatedByString:@";"];