在viewDidLoad之后NSArray变空

时间:2011-06-15 08:49:56

标签: objective-c cocoa-touch

我创建了一个对象,其中有一个数组

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)的值。

这有什么问题?

3 个答案:

答案 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;

}`