Objective-C только поддерживает передачу параметров по значению. Проблема здесь, вероятно, уже исправлена (так как этому вопросу больше года), но мне нужно уточнить некоторые моменты, касающиеся аргументов и Objective-C.
Objective-C является строгим надмножеством C, что означает, что все, что делает C, Obj-C делает также.
Быстрый просмотр Википедии, вы можете увидеть что Function parameters are always passed by value
Objective-C ничем не отличается. Здесь происходит то, что всякий раз, когда мы передаем объект функции (в данном случае UILabel *), мы передаем значение , содержащееся , по адресу указателя.
Что бы вы ни делали, это всегда будет ценностью того, что вы проходите. Если вы хотите передать значение ссылки , вам нужно будет передать ему ** объект (как это часто бывает при передаче NSError).
Это то же самое со скалярами, они передаются по значению, поэтому вы можете изменить значение переменной, которую вы получили в вашем методе, и это не изменит значение исходной переменной, которую вы передали в функцию.
Вот пример, облегчающий понимание:
- (void)parentFunction {
int i = 0;
[self modifyValueOfPassedArgument:i];
//i == 0 still!
}
- (void)modifyValueOfPassedArgument:(NSInteger)j {
//j == 0! but j is a copied variable. It is _NOT_ i
j = 23;
//j now == 23, but this hasn't changed the value of i.
}
Если вы хотите изменить i, вам нужно будет передать значение reference , выполнив следующее:
- (void)parentFunction {
int i = 0; //Stack allocated. Kept it that way for sake of simplicity
[self modifyValueOfPassedReference:&i];
//i == 23!
}
- (void)modifyValueOfPassedReference:(NSInteger *)j {
//j == 0, and this points to i! We can modify i from here.
*j = 23;
//j now == 23, and i also == 23!
}