Получение размера массива

У меня есть код, который требует использования цикла for для чтения переменных из массива.

int size=sizeof names;
NSLog(@"thelast one is %d",size);
NSString *usersName=userName.text;
NSString *usersPass=passWord.text;
for (i=0; i<=size;i++){

    NSString *namesArray=[names objectAtIndex:i];
    NSString *passArray=[pass objectAtIndex:i];
    NSLog(@"namesArray %@",namesArray); 
    NSLog(@"passArray %@",passArray); 
    if([namesArray isEqualToString:usersName]){
        userValid=1;
    NSLog(@"The content of arry4 is %@",namesArray);


    }
    if([passArray isEqualToString:usersPass]){
        passValid=1;
        NSLog(@"The content of arry4 is %@",passArray);
    }

    else {
        userValid=0;
        passValid=0;
    }

}

У меня возникли проблемы, потому что каждый раз, когда эта функция вызывается из программы, она почти так же, как если бы имена "sizeof" были неправильными, поэтому проверяются не все значения в массиве. Я вообще-то программист на Java, поэтому я привык к names.length, и мне сказали, что имена sizeof - это, по сути, одно и то же... любая помощь?

Приветствия.

Ответ 1

Не используйте sizeof. Используйте [names count].

Ответ 2

Вы хотите использовать [names count] not sizeof names. Sizeof будет давать вам размер самого фактического указателя объекта имен, а не количество элементов, так как это тип динамической памяти.

Ответ 3

Чтобы получить количество элементов, хранящихся в NSAarray, вы должны использовать метод экземпляра count, который возвращает NSUInteger.

Альтернативно, вы можете перебирать эти элементы, используя цикл for in, который доступен также на Java, если я правильно помню.

for (MyClass *element in myArray) {
    NSLog(@"%@", element);
}

Обратите внимание, что sizeof является оператором C, который возвращает размер в байтах своего операнда, поэтому он не говорит вам, сколько элементов хранится в NSArray, но размер в байтах одного экземпляра NSArray.

Ответ 4

Я знаю, что на ваш вопрос уже был дан ответ - но вот более Cocoa способ его написания

NSString *userName = userName.text;
NSString *userPass = passWord.text;

// Use a block enumerator
NSUInteger nameIdx = [names indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop) {
    return ([obj isEqualToString:userName]);
}];

// Is the name in the array
if (nameIdx == NSNotFound) {
    // Name not in array - so set to zero
    userValid = 0;
    passValid = 0;
} else {
    userValid = 1;
    // See if the corresponding password is correct
    NSString password = [pass objectAtIndex:nameIdx];
    if (![password isEqualToString:userPass]) {
        passValid = 0;
    } else {
        passValid = 1;
}

Ответ 5

Можно также использовать Fast Enumeration, в некоторых случаях это может быть более понятным для читателя:

NSString *userName = userName.text;
NSString *userPass = passWord.text;

BOOL userValid = NO;
BOOL passValid = NO;
int index = 0;
for (NSString *eachName in namesArray) {
    if ([eachName isEqualToString:userName) {
        userValid = YES:
        if ([[passArray objextAtIndex:index] isEqualToString:passWord) {
            passValid = YES;
        }
        break;
    }
    index += 1;
}