Частный интерфейс против частного метода - цель c

В чем разница между приватным методом и приватным интерфейсом? Например, я знаю, что если вы определяете метод в реализации и его интерфейс не упоминает об этом, он считается закрытым методом. Я также видел такие вещи, как:

@interface Collector()
@property (readonly) NSMutableDictionary *count;
@end

Внутри файла реализации .m.


person joshim5    schedule 15.10.2010    source источник


Ответы (2)


@interface Foo() создает расширение класса (я исправлен, реквизит для bbum) в интерфейсе Foo, что похоже на дополнительные методы, добавленные в интерфейс. Некоторые люди также используют @interafce Foo(Private) (категория) вместо расширения класса с (). Это больше похоже на «внедрение» новых методов в класс извне.

Размещение этого в файле .m просто не позволяет другим вещам «видеть его» в файле .h, но это все. В основном люди обычно используют категории или расширения классов в файлах .m для указания частных интерфейсов, но они также используются для таких вещей, как UIKit использует категории для добавления общедоступных методов row и section в NSIndexPath. (Это может сбивать с толку.)

Вам действительно не нужно определять частные методы таким образом, но если у вас есть метод с именем bar, который вызывает метод foo до того, как foo будет определен в исходном файле, вы получите предупреждение компилятора что-то вроде «сам объект может не отвечать на foo ". Вы можете избавиться от этого, определив foo перед определением bar или любого другого кода, вызывающего foo. То же самое с простым C и функциями.

Как говорит Оле, это не мешает никому вызывать приватные методы, это просто объявляет ваше намерение сделать их приватными и заставляет компилятор генерировать предупреждения «может не отвечать на» даже если они импортируют файл .h.

РЕДАКТИРОВАТЬ

См. также http://www.friday.com/bbum/2009/09/11/class-extensions-explained/ для некоторого объяснения категорий и расширений классов. Похоже, что расширения класса должны быть более правильными для определения частных методов с точки зрения предупреждения компилятора, потому что методы категории являются необязательными. Хотел бы я, чтобы моя книга объяснила это!

person Nimrod    schedule 15.10.2010
comment
Существует огромная разница между именованными категориями (foo) и расширением класса (). - person bbum; 15.10.2010
comment
У вас есть ссылка на это? Я ничего не вижу в книге Programming in Objective-C 2.0 по этому поводу. Из всего, что я могу сказать, похоже, что название категории просто необязательно. Не то чтобы я крупный эксперт или что-то в этом роде, но было бы полезно, если бы вы могли предоставить ссылку, объясняющую разницу между (Private) и (). - person Nimrod; 15.10.2010
comment
неважно, кажется, я нашел ваш блог friday.com/ bbum/2009/09/11/class-extensions-explained Интересно, почему в моей книге об этом ничего не говорится? - person Nimrod; 15.10.2010
comment
Я забыл, что писал это. Хорошо, что Google индексирует мою голову. - person bbum; 15.10.2010
comment
Были ли расширения классов чем-то вроде Objective-C 2.1? Я думал, что у меня есть авторитетная книга на эту тему, но либо ее нет, либо что-то было добавлено позже... - person Nimrod; 15.10.2010
comment
Я считаю, что расширения классов были введены с объективным C 2.0, хотя я могу ошибаться. - person johnw188; 15.10.2010
comment
Единственная официальная документация, в которой упоминаются расширения, которую я могу найти, — это документ Apple: developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ Не могу найти официальный документ стандартов для Objective-C 2.0.... - person Nimrod; 15.10.2010
comment
Спасибо, парни! Я также читал книгу Стивена Кочана. Я не помню, чтобы он говорил о категориях. Я тоже смотрю стэнфордс CS193P. Я проверю блог bbum, а также исследовательские категории. - person joshim5; 17.10.2010

В Objective-C нет полностью приватных методов. Метод, объявленный в разделе закрытого интерфейса в файле .m, невидим для внешних вызывающих объектов, но он не является закрытым. Если кто-то знает сигнатуру метода и игнорирует предупреждение компилятора, он может без проблем вызвать его извне.

person Ole Begemann    schedule 15.10.2010