问题描述
|
我创建了一个对象,其中有一个数组
问题
NSInteger num;
.....
NSArray * q;
-(questions*) a1:(NSString*) a1 a2:(NSString*) a2 a3:(NSInteger) a3;
@property(nonatomic,retain) NSArray *q;
问题
-(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中的另一个对象调用answer中使用对象问题。
我在viewDidLoad函数中调用了构造函数,并在数组中显示了这些值。
正常显示。
但是,当我尝试访问对象的数组时,它崩溃了,我什至无法检查数组的长度。
但是,我能够显示该对象的NSInteger(num)的值。
这怎么了?
解决方法
arrayWithObjects是自动释放的,您需要保留它或使用常规的alloc / init版本。
q = [[NSArray alloc] initWithObjects:a1,a2,nil];
, 正如Simon所说,构造函数完成后,您的NSArray对象将自动释放。如果您点击此链接,您将注意到有两种创建对象的方法:
- (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一起使用,否则可以使用其他方法。
, 尝试下面的代码。 ur a1,a2,a3对象正在获取您刚刚保留并加载到NSArray(name 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,nil];
num = a3;
return self;
}
return nil;
}`