这个代码错了吗?

时间:2015-06-09 09:05:40

标签: ios objective-c

我即将制作iPhone应用程序。 我遇到了一个问题。

NSArray *array2 = [NSArray alloc];
[array2 initWithObjects:@"a",@"b",@"c",@"d",nil];
NSMutableArray *arr3 = [NSArray ArrayWithObjects:@"e",@"f",@"g",nil];
NSUInteger uInt1 = [array2 count];
uInt1 = [arr3 count];
NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithArray:array2];

NSLog(@"count : %d", [mutableArray count]);

这段代码错了吗? 我想我熟悉c语言。 但像c-objective类一样难以处理 NS家庭......

这是我第一次使用iPhone编程..

3 个答案:

答案 0 :(得分:1)

取决于你想要做什么,但从语法上来说,它应该是更像这样的东西:

NSArray *array1 = [[NSArray alloc] initWithObjects:@"a",@"b",@"c",@"d",nil];
NSMutableArray * array2 = [NSMutableArray arrayWithObjects:@"e",@"f",@"g",nil];
NSUInteger count1 = [array1 count];
NSUInteger count2 = [array2 count];
NSMutableArray * array3 = [[NSMutableArray alloc] initWithArray:array2];

几个笔记:

  • 虽然你可以在两条不同的线上从技术上做一个alloc然后是一个NSObject的初始化,但通常你会在第1行上一起完成它们。
  • 第二行使用类方法实例化NSMutableArray。在引擎盖下(通常),这些类型的方法将执行alloc&初始化并返回一个对象。但在(稍微)更高级的情况下,它们可能会返回零,这意味着无法创建对象。例如,您想要实例化AVCaptureDevice,但不存在。
  • 您无法创建NSArray并将其分配给NSMutableArray,但您可以采用其他方式 - NSMutableArray是NSArray的子​​类。

答案 1 :(得分:0)

NSArray *array2 = [NSArray alloc];
[array2 initWithObjects:@"a",@"b",@"c",@"d",nil];

您应该将initWithObjects:的结果分配给array2,通常您甚至不会从alloc分割init...

NSArray *array2 = [[NSArray alloc] initWithObjects:@"a",@"b",@"c",@"d",nil];

或使用arrayWithObjects:方法:

NSArray *array2 = [NSArray arrayWithObjects:@"a",@"b",@"c",@"d",nil];

或使用文字语法

NSArray *array2 = @[@"a",@"b",@"c",@"d"];
NSMutableArray *arr3 = [NSArray ArrayWithObjects:@"e",@"f",@"g",nil];

您不能将不可变数组NSArray分配给可变数组NSMutableArrayArrayWithObjects的情况也是错误的。正确的是:

NSMutableArray *arr3 = [NSMutableArray arrayWithObjects:@"e",@"f",@"g",nil];

这里没有错:

NSUInteger uInt1 = [array2 count];
uInt1 = [arr3 count];
NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithArray:array2];
NSLog(@"count : %d", [mutableArray count]);

%d不应与NSUInteger一起使用。您将在64位计算机上收到编译器警告。

将数字打印为对象:

NSLog(@"count : %@", @([mutableArray count]));

答案 2 :(得分:0)

一个。 NSArray创作

NSArray *array2 = [NSArray alloc];
[array2 initWithObjects:@"a",@"b",@"c",@"d",nil];

这是一个真正的错误:您必须尊重init…方法具有返回值:

NSArray *array2 = [NSArray alloc];
array2 = [array2 initWithObjects:@"a",@"b",@"c",@"d",nil];

但正如sulthan所说,你通常会在一个声明中这样做。

然而,你可以忘记我所说的内容,因为你可以希望你想用数组文字更容易做到:

NSArray *array2 = @[@"a",@"b",@"c",@"d"];

B中。 NSMutableArray创作

NSMutableArray *arr3 = [NSArray ArrayWithObjects:@"e",@"f",@"g",nil];

有一个错误,编译器应警告您:您创建NSArray的实例并将其分配给NSMutableArray的对象引用,什么是子类。选项:

NSMutableArray *arr3 = [NSMutableArray ArrayWithObjects:@"e",@"f",@"g",nil];

NSMutableArray *arr3 = [@"e",@"f",@"g" mutableCopy];

℃。登录

NSLog(@"count : %d", [mutableArray count]);

有一个错误,编译器应警告您:-count返回类型为NSUInteger的值。这可以是int或long,具体取决于体系结构。由于clang确实格式化了字符串检查,因此%d是longs的错误占位符。通常的处理方法是:

NSLog(@"count : %ld", (long)[mutableArray count]);