Что сам в ObjC? Когда я должен использовать его?

Возможно, потому что это приводит к беспорядку в программистах, которые не знают то, что действительно происходит негласно, который мог в свою очередь привести к некоторому неэффективному или плохо написанному коду.. Просто предположение, я не думаю, что это - "плохая вещь" также.

6
задан jscs 20 October 2017 в 23:53
поделиться

5 ответов

self относится к экземпляру текущего класса, в котором вы работаете, и да, он аналогичен this в Java.

Вы используете это, если вы хотите выполнить операцию над текущим экземпляром этого класса. Например, если вы пишете метод экземпляра для класса и хотите вызвать метод в том же экземпляре, чтобы что-то сделать или получить некоторые данные, вы должны использовать self :

int value = [self returnSomeInteger];

Это также часто используется для методов доступа в экземпляре (то есть для методов установки и получения), особенно с методами установки, если они реализуют дополнительные функции, а не просто устанавливают значение переменной экземпляра, так что вам не нужно повторять этот код снова и снова, когда вы хотите установить значение этой переменной, например:

[self setSomeVariable:newValue];

Одно из наиболее распространенных применений self - во время инициализации класса. Пример кода может выглядеть так:

- (id)init
{
    self = [super init];

    if(self!=nil) {
        //Do stuff, such as initializing instance variables
    }

    return self;
}

Это вызывает инициализатор суперкласса (через super ), то есть как цепная инициализация происходит вверх по иерархии классов. Возвращаемое значение затем устанавливается на self , однако, поскольку инициализатор суперкласса может возвращать объект, отличный от суперкласса.

14
ответ дан 8 December 2019 в 05:22
поделиться

self - это подразумеваемый аргумент для всех методов Obj-C, который содержит указатель на текущий объект в методах экземпляра и указатель на текущий класс в методы класса.

Другой подразумеваемый аргумент - это _cmd , который является селектором, отправленным методу.

Имейте в виду, что вы получаете только self и _cmd в методах Obj-C. Если вы объявляете метод C (++), например, как обратный вызов из некоторой библиотеки C, вы не получите self или cmd.

Дополнительные сведения см. В разделе Использование скрытых аргументов руководства по программированию в среде выполнения Objective-C.

5
ответ дан 8 December 2019 в 05:22
поделиться

Да, это точно так же, как "this" в Java - оно указывает на "текущий" объект.

3
ответ дан 8 December 2019 в 05:22
поделиться

Два важных примечания:

  1. Сам класс, например UIView (я НЕ говорю об объекте UIView ), сам по себе является объектом. , и с ним связано я . Так, например, вы можете ссылаться на self в методе класса следующим образом:

     // Это работает
    + (void) showYourself {[self performSelector: @selector (makeTheMostOfYourself)]; }
    
    // Метод класса!
    + (void) makeTheMostOfYourself {}
    
  2. Обратите внимание, что компилятор НЕ генерирует никаких предупреждений или ошибок, даже если self , на который вы имеете в виду ссылку, является объектом, а не классом. Таким способом ОЧЕНЬ легко вызвать сбои, например:

     // Это приведет к сбою!
    + (void) showYourself {[self performSelector: @selector (makeTheMostOfYourself)]; }
    
    // Метод объекта!
    - (void) makeTheMostOfYourself {}
    
    
    
    // Это тоже приведет к сбою!
    - (void) showYourself2 {[self performSelector: @selector (makeTheMostOfYourself2)]; }
    
    // Метод класса!
    + (void) makeTheMostOfYourself2 {}
    

    К сожалению, это немного усложняет использование методов класса, что прискорбно, поскольку они являются ценным инструментом для инкапсуляции путем сокрытия информации. Только будьте осторожны.

2
ответ дан 8 December 2019 в 05:22
поделиться

self - это указатель объекта на текущую таблицу отправки экземпляров. Это неявный первый аргумент для каждой функции-члена объекта, и он назначается при вызове этой функции.

В таких функциях, как init, вам нужно быть осторожным, чтобы при вызове суперкласса init вы переназначили self как возвращаемое значение, поскольку init суперкласса может переопределить, на что указывает self.

super похож на self, за исключением того, что он указывает на таблицу диспетчеризации суперкласса.

-1
ответ дан 8 December 2019 в 05:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: