NSArray становится пустым после viewDidLoad - PullRequest
0 голосов
/ 15 июня 2011

Я создал объект и в нем есть массив

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 ]

1 голос
/ 15 июня 2011

arrayWithObjects автоматически выпущен, вам нужно сохранить его или использовать обычную версию alloc / init ....

q = [[NSArray alloc] initWithObjects:a1, a2, nil]; 
0 голосов
/ 15 июня 2011

попробуйте код ниже. ur 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;

} `

0 голосов
/ 15 июня 2011

Как говорит Саймон, ваш объект 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, иначе вы можете использовать другие виды методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...