Категории Objective-C: Могу ли я добавить свойство для метода, не входящего в мою категорию? - PullRequest
28 голосов
/ 26 марта 2010

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

Класс A:

@interface ClassA
- (NSString*)foo;
@end

Класс А, категория

@interface ClassA (Properties)
- (void)someCategoryMethod;
@property (nonatomic, readonly) NSString *foo;
@end

Теперь, когда я делаю это, это похоже на работу ( РЕДАКТИРОВАТЬ: Может быть, это не работает, не жалуется, но я вижу странность), но это дает мне предупреждения, потому что я не синтезировать свойство в моей категории реализации. Как мне сказать компилятору, что все на самом деле просто отлично, так как оригинальный класс синтезирует это свойство для меня?

Ответы [ 3 ]

32 голосов
/ 26 марта 2010

Вот предупреждение, которое вы получаете:

warning: property ‘foo’ requires method '-foo' to be defined - use @synthesize, @dynamic or provide a method implementation

Чтобы подавить это предупреждение, включите его в свою реализацию:

@dynamic foo;

1 голос
/ 13 апреля 2014

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

  1. Добавление свойств в категории, не касаясь базового класса: http://compileyouidontevenknowyou.blogspot.com/2012/06/adding-properties-to-class-you-dont.html
  2. Доступ к iVars из категорий: http://compileyouidontevenknowyou.blogspot.com/2012/06/if-you-want-to-keep-everything-in-your.html

Это НАМНОГО лучше, чем метод Swizzling, по крайней мере: гораздо безопаснее.

1 голос
/ 26 марта 2010

Если что-то объявлено в интерфейсе вашей категории, его определение относится к реализации вашей категории.

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