Комментарии 19
Вообще говоря, рекомендуется через #import подключать только те заголовочные файлы, описание классов которых будет использоваться в данном файле.
То есть, если у вас заголовочный файл — вы подключаете через #import только тот класс, от которого наследуетесь (или, соответственно, протоколы, которые реализуете), а все классы, которые принимает или возвращает ваш объект, определяете через @class.
В файле реализации, соответственно, подключаются те заголовки, которые реально используются в коде.
То есть, если у вас заголовочный файл — вы подключаете через #import только тот класс, от которого наследуетесь (или, соответственно, протоколы, которые реализуете), а все классы, которые принимает или возвращает ваш объект, определяете через @class.
В файле реализации, соответственно, подключаются те заголовки, которые реально используются в коде.
Пришлось два раза читать, чтоб всё уловить.
НЛО прилетело и опубликовало эту надпись здесь
Наверное, когда автор программы пытается мучительно придумать имя своему новому классу?
О гипотетических. Пытался объяснить необходимость пакетов, наверное, не очень ясно написал.
При совпадении имен классов иногда получается интересное поведение. Проиложение собирается и даже запускается. Но при старте в консоль выдает, что есть два класса с одинаковым именем и какой будет использован незнает.
Приходящим из мира Java и автору очень рекомендую почитать данный документ:
developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/CodingGuidelines.pdf
Данные принципы именования сложились уже давно и желательно их придерживаться.
В отличие от Java (<irony>в которой принято все подряд начинать с get</irony>), в Objective-C префикс-глагол «get…» используется для косвенного получения данных (для одного или нескольких значений).
Например, у NSData есть метод:
-(void)getBytes:(void *)buffer length:(NSUInteger)length
Он не возвращает байты напрямую (метод является void), а записывает их по ссылке в buffer.
В вашем случае код Feature должен выглядеть как-то так:
@interface Feature: NSObject
-(Profile *)profileWithName:(NSString*)name;
@end
PS. Прошу прощения за отсутствие форматирования.
developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/CodingGuidelines.pdf
Данные принципы именования сложились уже давно и желательно их придерживаться.
В отличие от Java (<irony>в которой принято все подряд начинать с get</irony>), в Objective-C префикс-глагол «get…» используется для косвенного получения данных (для одного или нескольких значений).
Например, у NSData есть метод:
-(void)getBytes:(void *)buffer length:(NSUInteger)length
Он не возвращает байты напрямую (метод является void), а записывает их по ссылке в buffer.
В вашем случае код Feature должен выглядеть как-то так:
@interface Feature: NSObject
-(Profile *)profileWithName:(NSString*)name;
@end
PS. Прошу прощения за отсутствие форматирования.
Полезный комментарий, спасибо
(Лирическое отступление) Кстати, в Java именно с этим проблемы. Спецификацией четко не определено, что должен возвращать метод
— ссылку на someList (чаще всего так и делают)
— unmodifiable wrapper для someList
— копию someList
При отсутствии в Java явных ссылок большинство кодеров не видят и не понимают различий (какая ссылка? мне же вернули сам объект!). А потом вылезают трудно отловимые ошибки с concurrent modification и immutability.
List getSomeList() {
return someList;
}
— ссылку на someList (чаще всего так и делают)
— unmodifiable wrapper для someList
— копию someList
При отсутствии в Java явных ссылок большинство кодеров не видят и не понимают различий (какая ссылка? мне же вернули сам объект!). А потом вылезают трудно отловимые ошибки с concurrent modification и immutability.
«Можно вызывать любой ранее определенный метод любого класса (но если метод не определен — нельзя)...»
Как бы можно:
Как бы можно:
id someObject;
[someObject performSelector:@selector(anySelectorYouCanImagine)];
Мне понравилась эта статья больше чем предыдущая, хоть и пишу на Objective-C уже давно, читать было все равно интересно!
Как структурировать классы, если нет пакетов? Все классы проекта должны быть в одном месте? О_о.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Шокирующий Objective-C для Java программистов, часть вторая