故事是这样的,很久很久以前,有7个可爱的小UIbutton,是再代码里,是用
NSMutableArray *buttonsArray = [NSMutableArray array];这样的创建出来的,然后这个7个按钮,点击之后都需要执行clickHandler这个方法,于是有了上面:
for (int i = 0; i < 7; i ++) {
UIButton *button = [[UIButton alloc]init];
//...略去给button设置frame或者layer上的属性的代码
[buttonsArray addObject:button];
[button addTarget:self action:@selector(clickHandler)
forControlEvents:UIControlEventTouchUpInside];
}
[button addTarget:self action:@selector(clickHandler),
forControlEvents:UIControlEventTouchUpInside];
可是呢,这个clickHandler这个方法太调皮了,它非要打一顿那个调用它的button,这时候问题就出来了,怎么能找到是buttonArray中的哪个button调用的clickHandler呢?
------解决方案--------------------
是这样的,你可以不加“:”号,这样就不传递任何值。但是如果你要加“:”号的话,一定会将当前的这个按钮传递到你指定的参数中。
- (void)click:(UIButton *)sender {}
如上所示,你会带一个button参数到方法中。因为你点击的那个button是addsubview上去的,所以你点击的button的对像的持有者会变成他的父view,即使你把当前的button release掉了,你点击按钮的时候还是会把当前的按钮传递到方法中。因为按钮是在堆内存中的,父view对它进行持有。为了更好的知道是哪一个button,你可以设置tag值,通过tag值可以很好的判断7个按钮到底哪个是哪个,终究还是理解好堆内存中的button对像,有两个或者更多的持有者,其中父view持有的同时会传递参数到你点击事件的方法中