Ios 为什么可以';我不能将对象添加到此数组吗?
出于某种原因,当我创建NSMutableArray时,它不会添加SKLabelNodes。我将它们添加到代码中,但当我请求计数时,它会给我0。我做错什么了吗?或者是应该有效的东西不起作用了?我真的不知道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
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也是关于属性的:-)但是,我对你的问题的回答是:在这种情况下,我更喜欢实例变量,因为它需要更少的代码,而且更重要。这并不能解释为什么不能将节点添加到数组中。