когда и где размещать объявления @class - PullRequest
4 голосов
/ 15 июля 2010

Я работаю над проектом с несколькими пользовательскими классами.У меня есть CardModel (NSObject), который имеет некоторые целочисленные свойства для хранения данных, и Deck (NSObject), который имеет массив для хранения группы CardModels, а затем CardView (UIView), который имеетCardModel как свойство, которое я создаю, когда выбираю CardModel из Deck.И затем у меня есть куча UIViewControllers, которую я перемещаю по UINavigationController.

Мой вопрос о том, где и когда использовать директиву компилятора @class.

Если я создаю подкласс UIViewController, создавая новый файл и подклассифицируя его, я должен использовать @class MyViewController в заголовке MyViewController.h или .m и он идет в заголовке файла, который фактически использует контроллер (например, когда один контроллер собирается создать экземпляр другого типа контроллера и поместить его в стек).Или мне вообще нужно это использовать?Требуется ли это только в том случае, если я действительно добавлю новые свойства в свой класс помимо того, что есть в стандартной реализации?Кажется, я помещаю @class повсеместно, просто убедитесь, что я не получаю ошибок, но я не понимаю, когда мне это нужно.

Спасибо!

Ответы [ 2 ]

8 голосов
/ 15 июля 2010

Вы используете его в .h, чтобы сообщить о пользовательском классе, не включая .h для пользовательского класса.

Пример: два пользовательских класса: Car и Wheel

Car.h
----------------
@interface Car : NSObject {
}
- (void)addWheel:(Wheel*)newWheel;
@end

Car.h не знает о классе 'Wheel', поэтому выдает ошибку, поэтому вы можете импортировать Wheel.h следующим образом:

Car.h
----------------
#import "Wheel.h"

@interface Car : NSObject {
}
- (void)addWheel:(Wheel*)newWheel;
@end

НО вам также не нужно это делать.Car.h не нужно ничего знать о классе Wheel, просто нужно знать, что он существует.Итак, вы используете @class, чтобы просто сказать: «Эй, этот класс существует. Поверьте мне на слово».

Car.h
----------------
@class Wheel;

@interface Car : NSObject {
}
- (void)addWheel:(Wheel*)newWheel;
@end

Затем внутри Car.m, когда вам действительно нужно знать окласс Wheel (свойства, методы и т. д.), в который вы должны импортировать Wheel.h.

4 голосов
/ 15 июля 2010

Директива @class используется, когда вам нужен заголовок, чтобы узнать о классе, но вы не хотите импортировать файл заголовка класса;например, когда вам нужно избежать циклических зависимостей.

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