Objective-C – Где объявляются экземпляры классов?

Я делаю программу с использованием Objective-C (Xcode), и мне нужно иметь возможность создать экземпляр другого класса.

- (void)viewDidLoad { [super viewDidLoad]; currentSide = 0; [self loadStage]; Cube *cube = [[Cube alloc] init]; } 

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

Я новичок в Obj-C, но, как я понимаю, у Viewcontroller.m не должно быть главного метода, поскольку это находится в файле main.m. Итак, где должны выполняться экземпляры классов?

Бьюсь об заклад, я пропустил что-то очевидное. Заранее спасибо.

4 Solutions collect form web for “Objective-C – Где объявляются экземпляры классов?”

Я сделал бы это так, в вашем файле .m:

  @interface YourClass () @property(nonatomic, strong) Cube cube; @end @implementation YourClass - (void)viewDidLoad { [super viewDidLoad]; currentSide = 0; [self loadStage]; self.cube = [[Cube alloc] init]; } @end 

Вам не нужно использовать синтаксис @property , но это стандартное соглашение, упрощает чтение вашего кода, позволяет вам получить getter или setter позже, если вам это нужно, и легко позволяет указать, как ARC должен лечить объект.

Если вы просто хотите простой ivar, а не свойство, вы просто хотите определить его в своей @implementation { ... } .

Просто нет необходимости в том, чтобы он находился на @interface поскольку это предоставляет внутреннюю работу вашего класса другим классам. См. Этот удивительно подробный ответ для получения дополнительной информации.

Пример использования ivar:

 @implementation YourViewController { Cube *cube; } 

Затем вы можете загрузить это из вашего viewDidLoad :

 - (void)viewDidLoad { [super viewDidLoad]; currentSide = 0; [self loadStage]; cube = [[Cube alloc] init]; } 

И можете свободно получить доступ к нему во всем классе:

 -(void) foo { cube.bar = @"baz"; } 

Я предпочитаю ivars над свойствами для чего-то вроде этого (внутренние переменные) по нескольким причинам:

  • Если вы не используете каких-либо геттеров или сеттеров, зачем накладывать дополнительный слой поверх ivar, если вы не собираетесь его использовать? (это все свойства в конце дня).

  • Они гораздо чище использовать в вашем классе ( cube вместо self.cube ).

  • Их гораздо быстрее определить.

  • Их гораздо легче отличить от внешних свойств (мне нравится разделять внешние значения и внутренние значения).

  • Они быстрее. Хорошо, только на пару наносекунд, но каждый маленький счет.

Хотя, стоит заметить, что в некоторых ситуациях свойства лучше, чем ivars (для внутреннего хранения):

  • Если вы хотите, чтобы ваш поток кода был безопасным, вы должны использовать atomic свойства, чтобы убедиться, что чтение и запись сериализованы правильно.

  • Если вы хотите использовать внутренние геттеры и сеттеры (мне это никогда не нужно было делать, но оно есть, если вы хотите).

  • Если вы хотите использовать KVO (хотя, опять-таки, мне это никогда не нужно было внутренне).

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

вы можете сделать ленивую инициализацию.

Объявите куб сначала как переменную свойства класса. (в вашем файле .m)

 @property Cube *cube; 

затем переопределить метод геттера куба следующим образом:

 - (Cube *)cube { if(!_cube) { _cube = [[Cube alloc] init]; } return _cube; } 

затем использовать объект в любом методе вашего класса

 [self.cube anyMethodOfCube]; 

определите свой объект в интерфейсе как:

 @implementation YourViewController { Cube *cube; } 

и инициализировать в первом использовании или непосредственно в viewDidLoad :

 cube = [[Cube alloc] init]; -(void)someOtherMethodInViewController { [cube cubeMethod];//now it is reachable } 

EDIT как originaluser2, указанный в комментарии, есть подробное объяснение для случая. но для улучшения ответа я изменился в соответствии с этой ссылкой.

Interesting Posts

распознаватель жестов не работает на subview

Остановка всех анимаций, выполняемых в разных потоках

Как изменить ярлык с датой после изменения системной даты в iOS?

generateCGImagesAsynchronouslyForTimes в ARC

Размер UIImage, возвращаемый с 'requestImageForAsset', даже не близок к настройке 'targetSize'

Обработка 64-битных целых чисел на 32-битном iPhone

iOS Получение ActionSheet-подобных кнопок

Должен ли я быть в Программе разработчиков iOS, чтобы отправлять мои сборки приложений через TestFlight?

Каким образом можно включить текст лицензии в приложении «Настройки» в iOS 7?

Как сделать кодировку параметров в Alamofire 4?

Короткое синтаксис IF ELSE в объективе C

Обновление элементов пользовательского интерфейса в фоновом потоке перед добавлением в представление

представляя звук графически как волна

Как сделать просмотр изображений всегда центром экрана при масштабировании с помощью прокрутки?

Ошибка компиляции файлов раскадровки с использованием Xcode 6 beta 5

PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.