Ios 为什么可以';我不能将对象添加到此数组吗?

Ios 为什么可以';我不能将对象添加到此数组吗?,ios,objective-c,sprite-kit,Ios,Objective C,Sprite Kit,出于某种原因,当我创建NSMutableArray时,它不会添加SKLabelNodes。我将它们添加到代码中,但当我请求计数时,它会给我0。我做错什么了吗?或者是应该有效的东西不起作用了?我真的不知道 self.titleLabels = [[SKNode alloc]init]; self.titleLabels.position = CGPointMake(CGRectGetMidX(self.frame), 700); self.titleLabelsArray = [[NSMuta

出于某种原因,当我创建NSMutableArray时,它不会添加SKLabelNodes。我将它们添加到代码中,但当我请求计数时,它会给我0。我做错什么了吗?或者是应该有效的东西不起作用了?我真的不知道

self.titleLabels = [[SKNode alloc]init];
self.titleLabels.position = CGPointMake(CGRectGetMidX(self.frame),  700);

self.titleLabelsArray = [[NSMutableArray alloc]initWithCapacity:5];

SKLabelNode *label1 = [SKLabelNode labelNodeWithFontNamed:@"Code-Pro-Demo"];
label1.text = @"0";
label1.fontSize = 90;
label1.fontColor = [SKColor colorWithRed:90/255.0f green:197/255.0f blue:198/255.0f alpha:1];
label1.position = CGPointMake(-150, 100);
label1.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:label1.frame.size];
label1.physicsBody.dynamic = NO;

SKLabelNode *label2 = [SKLabelNode labelNodeWithFontNamed:@"Code-Pro-Demo"];
label2.text = @"1";
label2.fontSize = 90;
label2.fontColor = [SKColor colorWithRed:1 green:1 blue:1 alpha:1];
label2.position = CGPointMake(-30, 100);
label2.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:label2.frame.size];
label2.physicsBody.dynamic = NO;

SKLabelNode *label3 = [SKLabelNode labelNodeWithFontNamed:@"Code-Pro-Demo"];
label3.text = @"2";
label3.fontSize = 90;
label3.fontColor = [SKColor colorWithRed:1 green:1 blue:1 alpha:1];
label3.position = CGPointMake(150, 100);
label3.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:label3.frame.size];
label3.physicsBody.dynamic = NO;

SKLabelNode *label4 = [SKLabelNode labelNodeWithFontNamed:@"Code-Pro-Demo"];
label4.text = @"3";
label4.fontSize = 90;
label4.fontColor = [SKColor colorWithRed:1 green:1 blue:1 alpha:1];
label4.position = CGPointMake(-150, 0);
label4.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:label4.frame.size];
label4.physicsBody.dynamic = NO;

SKLabelNode *label5 = [SKLabelNode labelNodeWithFontNamed:@"Code-Pro-Demo"];
label5.text = @"4";
label5.fontSize = 120;
label5.fontColor = [SKColor colorWithRed:228/255.0f green:70/255.0f blue:38/255.0f alpha:1];
label5.position = CGPointMake(10, -1);
label5.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:label5.frame.size];
label5.physicsBody.dynamic = NO;


[self.titleLabels addChild:label1];
[self.titleLabels addChild:label2];
[self.titleLabels addChild:label3];
[self.titleLabels addChild:label4];
[self.titleLabels addChild:label5];

[self addChild:self.titleLabels];

[self.titleLabelsArray addObject:label1];
[self.titleLabelsArray addObject:label2];
[self.titleLabelsArray addObject:label3];
[self.titleLabelsArray addObject:label4];
[self.titleLabelsArray addObject:label5];
NSLog(@"%i",self.titleLabelsArray.count);
使用以下命令:

self.titleLabels.children

它是childnodes的内置数组

正如您在自己的回答中所指出的,在这种情况下,不需要将5个SKLabelNode添加到不同的数组中,事实上,您可以使用self.titleLabels.children对它们进行迭代

然而,我试图理解为什么您的原始代码不能按预期工作,事实上,您的最后一行代码确实应该打印数字5

步骤1

编译器不喜欢这一行

NSLog(@"%i",self.titleLabelsArray.count);
因为不应将NSUInteger类型的值用作格式参数。改用这个:

NSLog(@"%lu",(unsigned long)self.titleLabelsArray.count);
步骤2

如果属性titleLabelsArray未声明为弱,则代码工作正常(并打印5)。 例如,这是一个正确的声明:

@property NSMutableArray * titleLabelsArray;
这是输出:

2015-03-29 16:09:31.919 MyProject[1231:695366] 5
另一方面,这种情况下的声明是错误的:

@property (weak) NSMutableArray * titleLabelsArray;
现在您可以得到以下输出:

2015-03-29 16:10:59.713 MyProject[1275:699690] 0
所以我的问题是:如何声明属性titleLabelsArray

步骤3

最后,我建议您在不需要公开变量的情况下使用实例变量而不是属性

你可以这样申报

@implementation YourSuperCoolClass
{
    NSMutableArray * titleLabelsArray;
}
然后您可以不使用self来访问它。前缀:

[titleLabelsArray addObject:label1];
[titleLabelsArray addObject:label2];
[titleLabelsArray addObject:label3];
[titleLabelsArray addObject:label4];
[titleLabelsArray addObject:label5];

NSLog(@"%lu",(unsigned long)titleLabelsArray.count);

您正在数组标题标签数组和标题标签中使用“self”。这意味着您必须在头文件中使它们成为类属性。一旦你这么做了,一切都很好。是的,我已经这么做了,我的答案是:)使用IVAR而不是属性的建议需要一些理由。对于ARC,差异很大程度上取决于风格。通常的做法是使用类扩展中声明的属性,这样它们就不是公共接口的一部分。你为什么反对房产?你好,卡莱布,你说得对。您还可以通过.m文件中的类扩展名实现封装。我个人更喜欢@implementation{…}块,因为它更重要。这里已经讨论了这个主题,有一个非常好的答案,有75张赞成票,鼓励@implementation{…}方法。您链接的问题完全是关于在哪里声明IVAR,而不是在IVAR和属性之间进行选择。在ARC之前,属性通常是首选的,即使是内部使用,因为它们简化了内存管理。正如我上面所说,对于ARC,选择在很大程度上取决于风格。但是如果你建议某人使用IVAR而不是属性,你应该为这个建议提供一些理由。我的错!我认为选项3也是关于属性的:-)但是,我对你的问题的回答是:在这种情况下,我更喜欢实例变量,因为它需要更少的代码,而且更重要。这并不能解释为什么不能将节点添加到数组中。