如何获取实例variables名称?

我用下面的编程方式创build了一个带有两个UIButton的简单的iPhone屏幕。

- (void)viewDidLoad { [super viewDidLoad]; UIButton *buttonOne = [UIButton buttonWithType:UIButtonTypeRoundedRect]; buttonOne.frame = CGRectMake(60, 70, 200, 40); [buttonOne setTitle:@"One" forState:UIControlStateNormal]; [self.view addSubview:buttonOne]; UIButton *buttonTwo = [UIButton buttonWithType:UIButtonTypeRoundedRect]; buttonTwo.frame = CGRectMake(60, 250, 200, 40); [buttonTwo setTitle:@"Two" forState:UIControlStateNormal]; [self.view addSubview:buttonTwo]; } 

现在按下标题为“One”的button,我想把variables名称命名为“buttonOne”,同样按下标题为“Two”的button,我想把variables名称命名为“buttonTwo”。

我没有find一个方法来获取variables名称。 任何帮助? 提前致谢

首先,我想声明这是不好的编码风格。 我假设你是这样做的,因为有一些特殊/独特的情况,或者作为概念certificate。 在生产应用程序中,这不是要走的路。 您应该将button设置为属性/ ivars,并且可以在按下button时进行比较,也可以为每个button分配标签或单独的目标/select器。 为避免这种做法,任何可以做的事情都是很好的,因为说实话,这种做法有点可怕(参见下一段关于nil / 0值的注释)。

您可以从以前的答案中查看下面的代码 – 它会返回给予指针的伊娃的名字。 但是,您必须将您的button声明为ivars而不是局部variables。 另外,如果两个ivars是零,它会报告相同的。 所以这只会工作,如果你所有的对象ivars不是零,你的原始typesivars不是0。

  #import <objc/objc.h> - (NSString *)nameOfIvar:(id)ivarPtr { NSString *name = nil; uint32_t ivarCount; Ivar *ivars = class_copyIvarList([self class], &ivarCount); if(ivars) { for(uint32_t i=0; i<ivarCount; i++) { Ivar ivar = ivars[i]; id pointer = object_getIvar(self, ivar); if(pointer == ivarPtr) { name = [NSString stringWithUTF8String:ivar_getName(ivar)]; break; } } free(ivars); } return name; } 

所以添加一个buttonPressed:方法buttonPressed:如下:

 - (void)buttonPressed:(id)sender { if ([sender isKindOfClass:[UIButton class]]) { NSString *buttonName = [self nameOfIvar:sender]; //Now you can do something with your button name } } 

第一个代码块的来源: 获取属性名称作为一个string

我们可以通过这种方式得到buttonOne.titleLabel.text的button标题名称。 我们无法获取variables名称