【发布时间】:2011-07-01 17:37:36
【问题描述】:
执行时
[self.blockViews addObject:curBlockView];
我收到一个错误
2011-07-01 13:35:26.240 Block Breaker[42061:207] -[__NSArrayI addObject:]:无法识别的选择器发送到实例 0x4e037a0
我对 Objective-C 很陌生。是我的init 方法中的东西吗?
//
// GameEngine.h
// Block Breaker
//
// Created by Chris Muench on 7/1/11.
// Copyright 2011 N/A. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface GameEngine : NSObject {
NSMutableArray *blockViews;
int numBlockRows;
int score;
}
@property (nonatomic, copy) NSMutableArray *blockViews;
@property int numBlockRows;
@property int score;
- (void) setup;
- (void) setupBlocks;
@end
//
// GameEngine.m
// Block Breaker
//
// Created by Chris Muench on 7/1/11.
// Copyright 2011 N/A. All rights reserved.
//
#import "GameEngine.h"
#import "Block.h"
#import "BlockView.h"
@implementation GameEngine
@synthesize blockViews;
@synthesize numBlockRows;
@synthesize score;
- (id) init
{
if ((self = [super init]))
{
self.blockViews = [[NSMutableArray alloc] init];
self.numBlockRows = 2;
self.score = 0;
}
return self;
}
- (void) setup
{
[self setupBlocks];
}
- (void) setupBlocks
{
float blockWidth = 10;
float blockHeight = 10;
float rowSpacing = 2;
float colSpacing = 2;
float currentX = 0;
float currentY=10;
float screenWidth = 200;
for (int rowCounter=0;rowCounter<self.numBlockRows;rowCounter++)
{
while(currentX <=screenWidth)
{
Block *curBlock = [[Block alloc] initWithWidth:blockWidth height:blockHeight];
BlockView *curBlockView = [[BlockView alloc] initWithFrame:CGRectMake(currentX, currentY, curBlock.width, curBlock.height)];
curBlockView.block = curBlock;
[self.blockViews addObject:curBlockView];
currentX+=blockWidth+colSpacing;
[curBlock release];
[curBlockView release];
}
currentX=0;
currentY+=blockHeight+rowSpacing;
}
}
@end
【问题讨论】:
-
看来如果我更改@property (nonatomic, copy) NSMutableArray *blockViews, 保留,错误就会消失。但为什么呢?
-
再想一想,很多情况下不需要设置可变数组。该数组是可变的,这就是为什么您只需要“访问”它的指针来添加新对象。除此之外,您不需要使用
init中的设置器。您可以直接在那里引用 ivars。 -
你不想做 self.blockviews = [[NSMutableArray alloc] init];无论人们在下面回答的复制/保留问题如何。你最终会泄漏内存。使用 blockViews = [[NSMutableArray alloc] init];或 self.blockViews = [NSMutableArray 数组];
-
@sidyll:实际上,从封装的角度来看,在对象之间传递可变数组时复制它们是很有意义的。否则他们每个人都可以修改数组的同一个实例,这很快就很难跟踪。
标签: objective-c properties nsmutablearray nsarray