Как уже упоминалось во многих ответах, их не следует рассматривать как адреса памяти. Ознакомьтесь с этими ответами и здесь , чтобы понять их. Обращаясь к вашему последнему утверждению
* p1 и * p2 имеют свойство p2 = p1 + 1 или p1 = p2 + 1, если и только если они находятся рядом в физической памяти
верно только в том случае, если p1
и p2
относятся к одному типу или указывают на типы одинакового размера.
На самом деле:
-(IBAction) onClick1: (id) sender {
NSLog(@"User clicked %@", sender);
// Do something here with the variable 'sender'
}
отправитель
не является NSString
, это тип id
. Это просто элемент управления, отправивший событие. Таким образом, если ваш метод запускается при нажатии кнопки, будет отправлен объект UIButton
, который был нажат. Вы можете получить программный доступ ко всем стандартным методам и свойствам UIButton
.
Отправитель
должен быть элементом управления, инициировавшим действие. Однако вы не должны предполагать его тип и вместо этого должны оставить его определенным как id
. Вместо этого проверьте класс объекта в фактическом методе следующим образом:
- (IBAction)onClick1:(id)sender {
// Make sure it's a UIButton
if (![sender isKindOfClass:[UIButton class]])
return;
NSString *title = [(UIButton *)sender currentTitle];
}
Отправитель должен быть определен как идентификатор типа, а не как int или NSString. Отправитель - это реальный объект, вызывающий метод; если вы подключили его к кнопке, это будет UIButton, если это текстовое поле, то UITextField. Вы можете использовать это, чтобы получить информацию от элемента управления (например, текущее строковое значение текстового поля) или сравнить его с переменной экземпляра IBOutlet, если у вас есть несколько элементов управления, подключенных к одному и тому же методу действия.