2016-01-22 4 views
2

Инкапсуляция данных, или, как мне нравится называть ее, кому она принадлежит, и кто должен знать об этом, составляет много объектно-ориентированного программирования. Кому нужно знать, часто удовлетворяются методы доступа, но они становятся довольно дорогими, если все они приводят к objc_msgsend только для чтения переменной. C++ отвечает на проблему с помощью встроенных методов - используйте ключевое слово «inline» перед определением или определите метод в объявлении класса, а компилятор помещает код доступа в код вызывающего, сохраняя служебные данные, связанные с фактическим вызовом функции.Методы Inline Accessor (getter/setter) в Objective-C

class IntWrapper { 
public: 
    int getInt() { return anInt; } 
protected: 
    int anInt; 
}; 

Подобный синтаксис компенсируется ошибкой complier в Objective-C. Изучив языковые руководства в Xcode («[Object-Oriented] Programming с Objective-C»), я не вижу ссылки на «встроенный» метод. Есть ли такая вещь, как inline в Objective-C? Это называется чем-то еще? Если кто-нибудь может указать мне на документацию, которая ссылается на inline, очень ценится.

Используя простой тестовый код:

@interface ClassA : NSObject 
{ 
    int anInt; 
} 
- (int) anInt; 
@end 

@implementation ClassA 
- (int) anInt { return anInt; } 
@end 

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

+0

Только функции C могут быть встроены, методы Objective-C, к сожалению, нет. – Cristik

+0

Вы можете узнать больше об этом здесь: http://stackoverflow.com/questions/8194504/does-llvm-convert-objective-c-methods-to-inline-functions – Cristik

+1

И стоит добавить, что конвенция должна использовать '@ property', чтобы избежать шаблона объявления переменных и его аксессуаров. –

ответ

3

Все методы Objective-C отправляются динамически. Они могут быть переопределены подклассами. Их можно даже заменить во время выполнения («swizzled») с помощью API-интерфейса Objective-C.

В некотором смысле, они похожи на методы virtual на C++.

Таким образом, они не могут быть встроены.

Кстати, техника, которую вы цитируете, нарушает принцип, который вы цитируете («Кто владеет им и кто должен знать об этом?»). Включение реализации в объявление класса предоставляет детали реализации клиентам, которым это не нужно знать. Кроме того, компилятор, встраивающий код в клиенты, предотвращает изменение этой реализации без перекомпиляции, которая является fragile base class problem. Современный Objective-C позволяет избежать хрупкой проблемы базового класса, что означает, что класс framework может изменять, какие переменные экземпляра он имеет, не нарушая клиентов.

+0

Кроме того, ключевое значение кодирования – Kevin

+1

Я думаю, что программисты на С ++ обязательно считают, что если вы читаете интерфейс, тогда вы читаете только объявления методов и переменных в разделе 'public:' - не определения или что-либо в 'private:' (и зависит ли 'protected:' зависит от класса, который вы создаете, очевидно). Я уверен, что я не устарел, чтобы сказать, что даже частное хранилище должно быть опубликовано. Это противоположность мышления Objective-C, где мы не можем иметь никаких методов, которые действительно являются частными и вместо этого просто не рекламируют их. – Tommy

+1

... скорее, как Свифт, я думаю. Хотя Xcode не будет автоматически показывать вам только часть интерфейса. Предположительно, другие редакторы будут. Я думаю, что я делаю очень незначительное различие. Естественно, я уже дал вам положительный голос. – Tommy