2016-03-15 5 views
-1

Может у пожалуйста, скажите мне, что этот кусок кода означает:Может у пожалуйста, скажите мне, что этот кусок кода означает

- (id) initWithNumber: (int) n { 
    self = [super init]; 
    if (self) { 
     self->_number = n;  
    } 
    return self; 
} 
+2

Это основная цель-C. Кажется, вам нужно изучить язык, например, из книги или пройти курс. – gnasher729

ответ

3
- (id) initWithNumber: (int) n { 

Это инициализатор, который принимает int имени n, как это единственный параметр.

self = [super init]; 

Как и во многих объектно-ориентированных языков, self это имя, которое представляет собой «текущий» объект. Обычно вы не назначаете новое значение self, но вы делаете это в инициализаторе, потому что в Objective-C на самом деле легально, чтобы инициализатор возвращал другой объект, кроме того, который был выделен. Это очень редко, что на самом деле происходит, но это может быть, поэтому соглашение должно назначить результат инициализатора суперкласса self. Говоря об этом, super - это ключевое слово, которое на самом деле означает тот же объект, что и self, но сообщает компилятору начать поиск методов сопоставления в суперклассе. super - это то, как вы называете унаследованные методы. Таким образом, эта строка вызывает унаследованный метод init, который инициализирует объект в отношении суперкласса и присваивает результат self.

if (self) { 

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

 self->_number = n; 

Это глупая линия. Так как self является указателем на объект, он имеет право разыменовать этот указатель и получить доступ к полям базовой структуры, что и делает оператор ->. Но текущий объект уже находится в области видимости, поэтому вы можете просто сказать _number = n;, а не просто. Переменные экземпляра всегда находятся в области ваших методов экземпляра, поэтому вам никогда не нужно self->....

} 
    return self; 

Как описано выше, Инициализаторы нужно возвращать указатель на объект, так что здесь вы вернетесь self.

} 
+1

'self -> _ number = n;' точно эквивалентен '_number = n;' и не сохраняет никаких операций. Оба заявления разыгрывают «сам» при доступе к ivar. В обоих случаях адрес от себя может уже находиться в регистре и больше не загружается откуда-то. Оба, вероятно, не приводят к одному хранилищу, но должны запрашивать время выполнения для смещения ivar. Вы правы, что явное 'self->' избыточно. –

+0

@NikolaiRuhe Вы совершенно правы - я думал больше о мозговых операциях, чем о цикле процессора, но, учитывая, как я это написал, я уверен, что большинство людей интерпретируют это по-другому. – Caleb

+0

После перечитывания я думаю, что мой комментарий звучал пренебрежительно и немного wisenheimerish. Это не мое намерение. Я ценю, когда кто-то находит время, чтобы ответить на вопросы новичка на таком дыхании, поэтому я уже поддержал ваш ответ. И я не думал, что вы не знаете о моем дополнении, я просто хотел указать на это больше. –

0

Что вы действительно хотите знать?
Это начальный код класса, и в этом методе свойство экземпляра number установлено со значением n.

Смежные вопросы