viewDidLoad之后,NSArray变为空

问题描述

| 我创建了一个对象,其中有一个数组 问题
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;
}`     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...