这是第一堂课:
@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:@";"];
没有正确分配。
答案 0 :(得分:3)
让Apple为您处理内存管理要容易得多:将array1
和array2
属性从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:@";"];