Not bad. Since createFirstBlock and addOneBlock do essentially the same thing, so you only need one of them, not both. I'd remove the loop from createFirstBlock (you don't need to loop from 0 to 0) and keep that one. Or you could redeclare it as "createBlocks

int)numBlocks" and use the loop to create the desired number of blocks.
Code:
-(void)createOneBlock{
if (blockArray==nil){
blockArray = [[NSMutableArray alloc] init]; }
UIImage *blockImage = [UIImage imageNamed:@"block.png"];
UIImageView *block;
block = [[UIImageView alloc] initWithImage: blockImage];
int x = arc4random()%320;
int y = -500;
block.center = CGPointMake (x,y);
[self.view addSubview: block];
[blockArray addObject: block];
[block release];
}
-(void)moveBlocks {
if(gameState == kGameStateRunning) {
for (int i=0; i< [blockArray count]; i++) {
UIImageView *block = [blockArray objectAtIndex:i];
//move new center down
CGPoint newCenter = block.center;
newCenter.y = newCenter.y +10;
if (newCenter.y > 420) {
if (stoppedBlocks==nil){
stoppedBlocks = [[NSMutableArray alloc] init];
}
newCenter.y = newCenter.y -10;
[stoppedBlocks addObject: block];
[self createOneBlock];
continue;
}
block.center = newCenter;
}
[blockArray removeObjectsInArray: stoppedBlocks];
}
else {
if (showPlay.hidden) {
showPlay.hidden = NO;}
if (showInstructions.hidden) {
showInstructions.hidden = NO;}
if (showOpenfeint.hidden) {
showOpenfeint.hidden = NO;}
}
}
I changed the type of the loop so that we could add items from the array while the loop is running - you can't make changes to the array while doing the "fast enumeration" loop we had before. I also moved the blockArray removeObjectsInArray: outside the loop; we really only need to do that once after the loop is over.
I think that will do the trick. Test it out; blocks should fall, stop at the bottom of the screen, and a new block should appear.