gpt4 book ai didi

iphone - objective c 传递 block 作为 OOP 的参数

转载 作者:行者123 更新时间:2023-11-28 23:05:25 28 4
gpt4 key购买 nike

我创建了一个名为“Tile”的类,它是一个正方形,触摸时将调用传递的 block 。

-(id) initWithRect: (CGRect) r color: (ccColor4B) c block: (void (^) (void)) blk {
if ((self = [super init])) {
rect = r;
color = c;
block = blk;
tile = [CCLayerColor layerWithColor:color width:rect.size.width height:rect.size.height];
tile.position = ccp(rect.origin.x, rect.origin.y);
[self addChild: tile];
self.isTouchEnabled = YES;
}
return self;
}

//rect是正方形,我用CCLayerColor来表示正方形。

-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
CGPoint touchLocation = [Helper locationFromTouch: touch];
if (CGRectContainsPoint(rect, touchLocation)) {
block();
[tile setColor:ccGRAY];
return YES;

}
else {
return NO;
}
}

//触摸时调用 block 。

然后我制作了几个 Tiles,如下所示:

Tile* aTile = [Tile tileWithMidPos:ccp(512, 500) width:300 height:200 color:ccc4(250, 250, 250, 250) block:^{
[Helper playEffectButtonClicked];
}];

但是所有的瓦片实际上都执行最后一个瓦片传递的 block 。这里有什么问题? (每个瓦片都是一个对象,所以他们应该调用自己的 block )

最佳答案

block 分配在堆栈上。

在这种情况下,Tile 类应该复制 blk 参数:

-(id) initWithRect: (CGRect) r color: (ccColor4B) c block: (void (^) (void)) blk {
if ((self = [super init])) {
rect = r;
color = c;
block = [blk copy];
tile = [CCLayerColor layerWithColor:color width:rect.size.width height:rect.size.height];
tile.position = ccp(rect.origin.x, rect.origin.y);
[self addChild: tile];
self.isTouchEnabled = YES;
}
return self;
}

- (void)dealloc {
[block release];
[super dealloc];
}

如果您使用的是 ARC,如果将内存管理(复制和释放)传递给带有 block 参数的方法,则无需担心内存管理(复制和释放)。如果您将堆栈分配的 block 传递给具有 id 参数的对象,您仍然必须复制:

[myArray addObject:[^{ // some block } copy]];

Mike Ash 有 an article关于 block 和 ARC 非常值得一读。

关于iphone - objective c 传递 block 作为 OOP 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9360594/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com