我创建了一个对象,其中有一个数组
question.h
NSInteger num;
.....
NSArray * q;
-(questions*) a1:(NSString*) a1 a2:(NSString*) a2 a3:(NSInteger) a3;
@property(nonatomic,retain) NSArray *q;
question.m
-(questions*) a1:(NSString*) a1 a2:(NSString*) a2 a3:(NSInteger) a3{
self = [super init];
if(self){
q = [NSArray arrayWithObjects:a1,a2,nil];
num = a3;
return self;
}
return nil;
}
以下是问题:我在另一个对象中使用对象调用answer.m。
我在viewDidLoad函数中调用了构造函数,并在数组中显示这些值。
它正常显示。
但是,当我尝试访问对象的数组时,它会崩溃,我甚至无法检查数组的长度。
但是,我能够显示对象的NSInteger(num)的值。
这有什么问题?
答案 0 :(得分:1)
arrayWithObjects是自动释放的,你需要保留它或使用普通的alloc / init版本....
q = [[NSArray alloc] initWithObjects:a1, a2, nil];
答案 1 :(得分:0)
正如Simon所说,当构造函数完成时,你的NSArray对象已被自动释放。如果您遵循此link,您会注意到有两种方法可以创建对象:
- (void)printHello {
NSString *string;
string = [[NSString alloc] initWithString:@"Hello"];
NSLog(@"%@", string);
[string release];
}
你成为字符串对象的所有者,然后你必须释放它。或者,
- (void)printHello {
NSString *string;
string = [NSString stringWithFormat:@"Hello"];
NSLog(@"%@", string);
}
创建对象但不需要释放它,因为当printHello方法完成时,它将被发送到自动释放池。所以,如果你需要在方法中使用对象,那么NSArray是一样的,那么使用第一种方法使用alloc + init,否则你可以使用其他类型的方法。
答案 2 :(得分:0)
尝试以下代码。你的a1,a2,a3对象正在获取你刚刚保留的自动释放对象并加载到NSArray(名称q)`
-(questions*) a1:(NSString*) a1 a2:(NSString*) a2 a3:(NSInteger) a3{
self = [super init];
if(self){
[a1 retain];
[a2 retain];
[a3 retain];
q = [NSArray arrayWithObjects:a1,a2,nil];
num = a3;
return self;
}
return nil;
}`