В методе класса self
является указателем на класс.
В методе экземпляра self
является указателем на экземпляр объекта класса.
Давайте сосредоточимся на последнем, так как это наиболее распространенное использование self
.
Предположим, у нас есть класс Box
. Когда мы хотим, чтобы представить окно программно, мы создаем экземпляр класса Box
:
Box *myBox = [[Box alloc] init];`
Теперь мы можем создать экземпляр столько экземпляров коробок, как хотелось бы.
Box *greenBox = [[Box alloc] init];
Box *redBox = [[Box alloc] init];
Box *blueBox = [[Box alloc] init];
Теперь в Box
класса, мы будем иметь методы экземпляра. Это методы, которые вызываются при создании экземпляров объектов Box
. Например:
[greenBox someMethod];
[redBox someOtherMethod];
Но это внешняя сторона со ссылкой на поле, которое хочет вызвать метод по определенной ссылке на ящик.
Когда объект Box необходимо вызвать метод сам по себе, он использует self
в качестве ссылки на себя.
Так, скажем, когда someMethod
вызывается на объект Box, как часть someMethod
, объект Box нужно вызвать метод doStuff
на себя.
Таким образом, в Box.m
, мы могли бы иметь:
- (void)someMethod {
// doing actual stuff, then calling a method to do stuff
[self doStuff];
}
Где self
еще один способ в этом файле и мы называем его на объект, для которого someMethod
сообщение было направлено.
Это было бы похоже на наружного звонящего, говорящего [greenBox doStuff];
.
Но мы можем использовать self
другими способами.
Мы можем использовать self
для доступа к свойствам объекта.Например, рассмотрим это свойство в Box.h
,
@property BOOL canDoStuff;
Теперь вернемся к someMethod
:
- (void)someMethod {
// doing actual stuff then...
if (self.canDoStuff) {
[self doStuff];
}
}
И мы можем также использовать self
в качестве аргумента метода. Например:
- (void)someMethod {
// doing actual stuff then...
if (self.canDoStuff) {
[BoxHelperClass doStuffWithABox:self];
}
}
Вы знакомы с другими языками ООП? – nhgrif
Вы попробовали [функцию поиска] (http://stackoverflow.com/questions/14535527/use-of-self-keyword-in-objective-c)? – Till
нет, но я программировал на других игровых языках, таких как lua, где self относится к текущему «объекту», как к противоположным переменным @public. Поэтому я не совсем не понимаю, что это значит. – Freddy