2012-01-21 5 views
0

Я с трудом понять, как конкретный код работает, так что я пошел вперед и добавил строкуПонимание того, что именно «я» означает

NSLog(@"%@ - %@", [self class], NSStringFromSelector(_cmd)); 

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

Однако время [self class] возвращает имя класса, в котором метод фактически не присутствует. Например, он показывает следующее в консоли отладки - PhotographersTableViewController - shouldAutorotateToInterfaceOrientation :, тогда как метод shouldAutorotateToInterfaceOrientation фактически присутствует в CoreDataTableViewController.

Как это может произойти?

P.S. Кроме того, есть ли способ в Xcode добавить строку во все методы файла?

ответ

0

Если PhotographersTableViewController расширяет CoreDataTableViewController, тогда self является PhotographersTableViewController, хотя метод существует в CoreDataTableViewController.

0

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

4

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

По всей вероятности, у вас есть заявление в вашем коде, как:

@interface PhotographersTableViewController : CoreDataTableViewController { ... } 

Объявляет PhotographersTableViewController как расширение CoreDataTableViewController - PhotographersTableViewController называется наследуют в методы CoreDataTableViewController.

Когда вам вызов метода:

PhotographersTableViewController *myPhotoView; 
... 
[myPhotoView shouldAutorotateToInterfaceOrientation]; 

Тогда Obj-C первого ищет метода shouldAutorotateToInterfaceOrientation в классе PhotographersTableViewController, которая выйдет из строя, а затем в классе CoreDataTableViewController, который преуспевает - поэтому он вызывает метод, определенный в CoreDataTableViewController передающий ему текущий объект, то есть тот, на который ссылается переменная myPhotoView, так как значение аргумента self (self является просто аргументом метода, предоставленного автоматически Obj-C).

Этот процесс фундаментальный для наследования и Obj-C.

Поэтому при распечатке значения self вы видите исходный тип объекта.

Вышеупомянутые глянцевые надписи, многие из которых очень важны: не упоминание переменных экземпляра, скрытие, область видимости и т. Д. И т. Д. Если вы изучаете Obj-C и объектно-ориентированное программирование вместе, вам нужно найти хорошую книгу и прочитать подробности.

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