这种创建和填充 NSMutableArray 的尝试有啥问题?

Posted

技术标签:

【中文标题】这种创建和填充 NSMutableArray 的尝试有啥问题?【英文标题】:What is wrong with this attempt to create and populate an NSMutableArray?这种创建和填充 NSMutableArray 的尝试有什么问题? 【发布时间】:2013-10-04 14:17:23 【问题描述】:

在我的 .h 文件中,我有:

@property (nonatomic) NSMutableArray *cards;

在我的 .m 文件中,我有,在初始化程序中:

- (id) init

    self = [super init];
    self.cards = [NSMutableArray alloc];
    return self;

在填充许多可见和屏幕项目的循环中:

[self.cards addObject:noteView];

在触摸事件处理程序中,我有:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

    NSLog(@"In touchesBegan.");
    UITouch *touch = [touches anyObject];
    UIView *selectedView = nil;
    CGPoint touchLocation = [touch locationInView:self.view];

    for (UIView *card in _cards)
    
        CGRect cardRect = [card frame];
        NSLog(@"%f", cardRect.origin.x);
        NSLog(@"%f", cardRect.origin.y);
        NSLog(@"%f", cardRect.size.height);
        NSLog(@"%f", cardRect.size.width);
        if (CGRectContainsPoint(cardRect, touchLocation)) 
            NSLog(@"Match found.");
            selectedView = card;
            CGRect selectedFrame = selectedView.frame;
            selectedFrame.origin.y = -selectedFrame.size.height;
            selectedFrame.size = selectedView.frame.size;
            float heightRatio = (float) floor([[UIScreen mainScreen] bounds].size.height + .4) / (float) selectedFrame.size.height;
            float widthRatio = (float) floor([[UIScreen mainScreen] bounds].size.width + .4) / (float) selectedFrame.size.width;
            float ratio = MIN(heightRatio, widthRatio);
            selectedFrame.size.height *= ratio;
            selectedFrame.size.width *= ratio;
            selectedFrame.origin.x = -selectedFrame.origin.x * ratio;

        
    

我所做的每一次触摸的输出都是输出无条件的 NSLog 语句,但没有执行“Log this float”语句。看来我没有正确初始化或未正确填充 NSMutableArray。

无论我引用 _cards 还是 self.cards,我似乎都会得到相同的行为。

感谢您的帮助,

--编辑--

我似乎坚持的不是最初的想法。我现在有 self.cards = [[NSMutableArray alloc] init],但行为相同:我通过一个循环并填充一堆卡片,但是当我点击其中一个时,触摸处理程序输出“In touchesBegan”。但没有花车。给定一个更新的初始化程序,为什么 touchesBegan 在屏幕上显示了许多卡片之后就表现得好像没有看到任何卡片一样? (另一个输出应该给出多行浮点数,无论触摸是否针对特定卡片的目标。)

【问题讨论】:

你从未初始化过数组。 init 方法有“_cards = [NSMutableArray alloc];”。初始化数组还需要什么? 【参考方案1】:

你需要初始化数组!

self.cards = [[NSMutableArray alloc] init];

或者

self.cards = [NSMutableArray new];

它们都是等价物

使用alloc,您唯一要做的就是在内存中为该变量保留空间。

来自 Apple 文档:

alloc 
Returns a new instance of the receiving class.

init 
Implemented by subclasses to initialize a new object (the receiver) immediately after memory for it has been allocated.

【讨论】:

【参考方案2】:

您是否为此使用故事板?尝试在 viewDidLoad 中初始化您的卡片属性。

作为快速检查,尝试在向其添加对象的循环之前初始化该属性。

【讨论】:

以上是关于这种创建和填充 NSMutableArray 的尝试有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 NSMutableArray 没有被填充?

如何使用输入的文本字段填充 NSMutableArray

NSDictionary 变成 1 NSMutableArray

NSMutableArray 仅在填充另一个数组时越界

使用 CoreData 数据库填充 NSMutableArray

使用仅来自一个 NSMutableArray 的多个部分填充 tableview