Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 获取数组的大小_Objective C_Arrays_Sizeof - Fatal编程技术网

Objective c 获取数组的大小

Objective c 获取数组的大小,objective-c,arrays,sizeof,Objective C,Arrays,Sizeof,我有一些代码需要使用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 *passArr

我有一些代码需要使用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;
    }

}
int size=sizeof name;
NSLog(@“最后一个是%d”,大小);
NSString*usersName=userName.text;
NSString*usersPass=passWord.text;

对于(i=0;i不使用sizeof。使用
[names count]
您要使用[names count]不是sizeof names。sizeof将提供实际名称对象指针本身的大小,而不是元素数,因为它是动态内存类型。

要获取存储在
NSARRAY
中的元素数,应使用实例方法
count
,该方法返回
NSInteger

或者,您可以使用
for in
循环迭代这些元素,如果我没有记错的话,Java中也提供了该循环

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

请注意,
sizeof
是一个C运算符,它返回其操作数的字节大小,因此它不会告诉您该
NSArray
中存储了多少元素,而是一个NSArray实例的字节大小。

我知道您的问题已经得到了回答,但这里有一种更简单的编写方法

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;
}

还可以使用快速枚举,在某些情况下,读者可以更清楚地看到:

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;
}

使用NSDictionary而不是两个保存用户名和相应密码的数组不是更好吗?您没有一个
break
。这意味着,如果在有效名称后面有任何其他名称,那么循环将继续运行,并对
userValid
userPass
的值进行筛选。并且,您的命名不正确直观-你有
namesArray
,它包含一个字符串,等等-这使你的代码更难阅读…当然,你没有将密码存储为纯文本。对吗?对吗?!?这种方法的问题是,你没有索引。而且,由于他在不同的数组中有密码,没有索引,他无法匹配如果他使用字典,他可以使用快速枚举。