iPad большой NSArray - initWithObjects против ArrayWithObjects - PullRequest
2 голосов
/ 01 марта 2011

Может кто-нибудь прояснить это для меня?
Я создаю приложение для iPad, которое имеет TableViewController, который должен показывать что-то между 1000 и 2000 строк.У меня есть эти NSStrings в синглтоне.
В методе инициализации синглтона я инициализирую массив, содержащий все данные (не обязательно, чтобы это был последний способ - это было просто быстрое копирование и вставка для тестирования)
Я выполнил self.someArray = [[NSArray alloc]initWithObjects:, за которым последовало большое количество строк, за которым последовал ноль.
, который нормально работал в симуляторе, но вылетел из-за плохого доступа на iPad прямо при запуске приложения
Если я используюудобный метод [NSArray arrayWithObjects: вместо этого - он отлично работает.
Я посмотрел на инструменты, и общий объем памяти приложения составляет всего около 2,5 МБ.
Теперь я не знаю, почему это работает в одну сторону, ноне другой.
РЕДАКТИРОВАТЬ:

#import "StaticValueContainer.h"`

static StaticValueContainer* instance = nil;
@implementation StaticValueContainer
@synthesize customerRatingKeys;

+(StaticValueContainer*)sharedInstance
{
    if (instance == nil){
        instance = [[StaticValueContainer alloc]init];
    }
    return instance;
}

-(id)init
{
    if  ( ( self = [super init] ))
    {
        [self initCustomerRatingKeys];

    }
    return self;
}
-(void)init customerRatingKeys
{
 self.customerRatingKeys = [[NSArray alloc]initWithObjects:
 @"string1",
....
 @"string1245"

,nil
}

, как я уже сказал: он падает на устройстве с self.customerRatingKeys = [[NSArray alloc]initWithObjects:, но работает с * self.customerRatingKeys = [[NSArray arrayWithObjects...`

1 Ответ

7 голосов
/ 01 марта 2011

Ну, между ними нет большой разницы: arrayWithObjects возвращает автоматически освобожденный массив, который вам не нужно освобождать самостоятельно (если вы впоследствии не сохраните его), и initWithObjectsвозвращает массив, который вы должны затем освободить, чтобы избежать утечки памяти.С точки зрения производительности, между ними нет разницы.

Я бы посоветовал, если вы получаете ошибку неверного доступа при использовании initWithObjects, но не при arrayWithObjects, возможно, в вашем коде есть какая-то ошибка управления памятью.Если вы разместите сам код, вы, вероятно, получите более точный ответ.

...