Назначение себя на если условие-Цель C - PullRequest
3 голосов
/ 23 апреля 2011

self - это скрытая переменная экземпляра, которая указывает на текущий объект:

- (id) initWithAmount:(double)theAmount forBudget:(Budget *)aBudget{

        if(self = [super init]){

                budget = aBudget;
                amount = theAmount;

        }
        return self;
}

похожа ли она на

this.budget=super.aBudget;
this.amount=super.theAmount;

Обычно:

if(control)//true or false
     {
      //stmts will get executed 
     }

, новместо возврата истинного значения здесь присваивается значение super.Почему это так?

Это похоже на конструктор.Как использовать constructors(default,parameterised and copy) в объективе C?

Ответы [ 3 ]

4 голосов
/ 23 апреля 2011

Эта форма является лишь краткой формой следующего кода:

- (id)initWithAmount:(double)theAmount forBudget:(Budget *)aBudget {
  self = [super init]; // you must do this, because every object inherits all properties
                       // from the parent class, and they must be initialized

  // init can return nil if there was an error during the initialization
  // so if the parents initialization failed, there is no point of initializing
  // the child object
  if (self != nil) {
    budget = aBudget;
    amount = theAmount;
  }

  return self;
}
4 голосов
/ 23 апреля 2011

Поскольку выражение присваивания также возвращает результат присваивания,

if (self = [super init]) { ...

эквивалентно:

self = [super init];
if (self) { ...

И поскольку if не просто проверяет чистые логические значения, нообрабатывает все, что не равно нулю, не NULL или не nil как истинное, оператор if проверяет, если self равно nil после присваивания.

Когда мы пишемсобственные init методы, мы должны присвоить [super init] self, потому что метод init может возвращать объект, отличный от получателя метода.Если бы мы просто вызвали [super init] без присвоения ему self, мы могли бы инициализировать объект, отличный от self, что явно нежелательно.

1 голос
/ 23 апреля 2011

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

Вызов super используется только в назначенном инициализаторе. Вы можете иметь больше инициализаторов, которые всегда должны использовать назначенный инициализатор.

Узор

- (id)init { 
   self = [super init]; 
   if (self) {
      // code 
   }
   return self;
}

Это правильный способ обработки сбоев. Тест не пройдёт, если self = [super init]; вернет nil: в инициализаторах дерева наследования произошла ошибка, поэтому вы не хотите использовать неудачную инициализацию и пропустите свой собственный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...