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, вам нужно будет передать значение ссылки, выполнив следующие действия:
- (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!
}
person
Pier-Olivier Thibault
schedule
07.10.2011