addObjectsFromArray: не копировать в глобальный NSMutableArray - PullRequest
1 голос
/ 21 декабря 2011

Итак, вот частичный пример соответствующего кода.

static NSMutableArray *radioInputArray;
static NSMutableArray *buttonsArray;


- (IBAction)lookForRadioButtons:(id)sender {
    //  NSLog(@"Testing");
    NSError *error;
    NSString *radiostr = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"getRadios" ofType:@"txt"] encoding:NSASCIIStringEncoding error: &error] ;
    if (radiostr == nil)
    {
        NSLog (@"Error! %@", error);
    }
    else
    {
        NSLog(@"%@",radiostr);
        NSString *radiotxt=  [webView stringByEvaluatingJavaScriptFromString:radiostr];
        NSLog(@"%@", radiotxt);
        NSArray *myRadios = [radiotxt componentsSeparatedByString:@"::"];
        [radioInputArray addObjectsFromArray:myRadios];
        NSLog(@"%d", myRadios.count);
        NSLog(@"Number of buttons in global radio array %d", radioInputArray.count);
        NSLog(@"%d", scrollViewer.subviews.count);
    }
}

Таким образом, он не выдает никаких исключений и работает нормально, за исключением того, что после addObjectsFromArray: мой счет в глобальном NSMutableArray равен 0 (счет в myRadios = 56). Я почти уверен, что они должны быть равны на этом этапе, но это не так. Я объявил мой NSMutableArray вверху, чтобы к нему можно было получить глобальный доступ. Я пропускаю что-то такое, как выделение и инициализация этого? Разве это не делает это автоматически, как в C #? Опять же, это мой первый набег в мир Objective-C из программирования Windows, поэтому, пожалуйста, будьте осторожны, но не стесняйтесь критиковать.

Ответы [ 3 ]

1 голос
/ 21 декабря 2011

Ваши два глобальных массива не инициализированы.

Строки

static NSMutableArray *radioInputArray;
static NSMutableArray *buttonsArray;

просто определяют две переменные в качестве указателей на NSMutableArray, поэтому вам нужно, чтобы они указывали на фактический экземпляр класса NSMutableArray.

Где-то в вашем коде инициализации или через метод доступа (лучше всего, если метод класса), вы должны установить переменные на пустые, недавно выделенные NSMutableArray.

Вот способ сделать это:

+ (NSMutableArray*)radioInputArray
{
    if (!radioInputArray) {
        radioInputArray = [[NSMutableArray alloc] init]; 
    }

    return radioInputArray;
}

Затем используйте аксессор в своем коде вместо глобальной переменной.

0 голосов
/ 12 декабря 2015

Хорошее место для инициализации объекта - метод init в глобальном классе

Пример.

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

        self.globalAllArtworkArray=[[NSMutableArray alloc] init];
        self.globalCollectionArray=[[NSMutableArray alloc] init];
        self.globalLookbookArray=[[NSMutableArray alloc] init];

    }
    return self;

}

+(ASNGlobalClass *)shareManager
{
    static ASNGlobalClass *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];

    });

    return sharedInstance;
}
0 голосов
/ 21 декабря 2011

Это может произойти, если ваш radioInputArray равен nil, вы не инициализировали массив

, вам нужно добавить

[[radioInputArray alloc] init]; 

, прежде чем что-либо делать с radioInputArray

...