Цель C: Как написать персонализированный пользовательский Init

Очень простой вопрос, но в моем коде есть ошибка, на которую может ответить только одно предположение: мой класс не создается!

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

Я использую:

ObjectSelectionViewController *length = [[ObjectSelectionViewController alloc] initWithMeasureType:0]; ObjectSelectionViewController *mass = [[ObjectSelectionViewController alloc] initWithMeasureType:1]; ObjectSelectionViewController *volume = [[ObjectSelectionViewController alloc] initWithMeasureType:2]; NSLog(@"%@", [length measurementType]); NSLog(@"%@", [mass measurementType]); NSLog(@"%@", [volume measurementType]); 

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

Вот конструктор класса ObjectSelectionViewController:

 #import "ObjectSelectionViewController.h" @implementation ObjectSelectionViewController NSString *measurementType; -(ObjectSelectionViewController*) initWithMeasureType:(int)value { switch (value) { case 0: // Length measureType = @"Length"; break; case 1: // Mass measureType = @"Mass"; break; case 2: // Volume measureType = @"Volume"; break; } return self; } -(NSString*) measurementType { return measureType; } 

Спасибо за помощь, это сводит меня с ума!

5 Solutions collect form web for “Цель C: Как написать персонализированный пользовательский Init”

Вам нужно сделать measureType переменной экземпляра, так что каждый объект этого типа, который вы создаете, имеет свою собственную копию:

 @interface ObjectSelectionViewController : NSViewController { NSString * measureType; // Declare an NSString instance variable } - (id) initWithMeasureType: (int)value; @end 

Как бы то ни было, существует только одна копия переменной, и каждый раз, когда вы создаете экземпляр нового объекта, его значение изменяется. Поскольку каждый экземпляр ссылается на одну и ту же копию, все они получают одинаковое значение:

 ObjectSelectionViewController *length = [[ObjectSelectionViewController alloc] initWithMeasureType:0]; NSLog(@"%@", [length measurementType]); // Prints "Length" ObjectSelectionViewController *mass = [[ObjectSelectionViewController alloc] initWithMeasureType:1]; NSLog(@"%@", [length measurementType]); // Prints "Mass" 

Вам также необходимо изменить свой метод init... как упомянуто другими респондентами:

 - (id) initWithMeasureType: (int)value { // Call superclass's initializer self = [super init]; if( !self ) return nil; switch (value) { case 0: // Length measureType = @"Length"; break; case 1: // Mass measureType = @"Mass"; break; case 2: // Volume measureType = @"Volume"; break; } return self; } 

Поскольку вы назначаете литеральную строку переменной экземпляра, вам не нужно беспокоиться об управлении своей памятью; если вы делаете что-то более сложное, вы, вероятно, добьетесь успеха, объявив свойство . Другое примечание: методы инициализатора всегда должны возвращать id , общий указатель объекта, чтобы позволить подклассам работать правильно.

Сначала нужно вызвать [super init] , например:

 -(id) initWithMeasureType:(int)value { if ((self = [super init])) { switch (value) { case 0: // Length measureType = @"Length"; break; case 1: // Mass measureType = @"Mass"; break; case 2: // Volume measureType = @"Volume"; break; } } return self; } 

Конструкторы – это соглашение в Objective-C, а не функция языка. Так, например, нет автоматического вызова родительских конструкторов (так же, как вы не ожидали бы, что какой-либо другой переопределенный метод вызовет его родительские реализации). Точно так же имена, используемые для конструкторов, являются просто условностями, поэтому компилятор ничего не знает об init . Имея это в виду, то, что вы действительно хотите в качестве своего конструктора:

 -(id) initWithMeasureType:(int)value { if((self = [super init])) { switch (value) { case 0: // Length measureType = @"Length"; break; case 1: // Mass measureType = @"Mass"; break; case 2: // Volume measureType = @"Volume"; break; } } return self; } 

Предполагая, что measureType – это переменная экземпляра (объявленная как часть интерфейса, вообще говоря), а не глобальная, тогда она должна делать то, что вы хотите.

В вашем обычном методе инициализации вам просто нужно начать с:

 self = [super init]; 
 - (id) initWithMeasureType: (int)value { // Call superclass's initializer self = [super init]; if( !self ) return nil; switch (value) { case 0: // Length measureType = @"Length"; break; case 1: // Mass measureType = @"Mass"; break; case 2: // Volume measureType = @"Volume"; break; } return self; 

}

  • Как сделать баннер iAd внизу экрана?
  • Как рассчитать разницу во времени в минутах между двумя датами в iOS
  • UITableView не реагирует на касания в прозрачных областях
  • Слишком рано использовать ARC для новых проектов?
  • Безопасно ли планировать и отменять NSTimers в последовательной очереди GCD?
  • Как сохранить низкую задержку во время предварительного просмотра видео, поступающего с AVFoundation?
  • Подключение: AppDelegate, ViewController и XIB
  • Поток потокового потока с использованием SSO facebook - openURL не называется
  • Фоновый управляемый объект Контекст Ошеломляет анимацию пользовательского интерфейса
  • Что делать, если я не могу найти заголовок GPUImage.h для рамки GPUImage?
  • Упорядоченные отношения основных данных - как это управляется или что является стандартным заказом?
  • Interesting Posts

    Расширение добавления Cordova ios – Ошибка: не удалось найти файл -Info.plist или файл config.xml

    Как получить данные среза огромного видеофайла

    NSPredicate в NSFetchedResultsController не использует геттер категории

    Проведите по экрану UITableViewCell

    Два отдельных поставщика карт в одном приложении

    Каков правильный способ обработки изображений сетчатки из измененных nsdata?

    Очередь операций против очереди отправки для приложения iOS

    Невозможно добавить ALAssets в NSOperationQueue из блока перечисления

    Задать название UITabBarItem программным путем?

    Повторная аутентификация учетных данных пользователя Swift

    Сортировка массива на основе двух параметров

    Преобразование NSString данных JSON в NSArray

    Вызов родительской функции View Controller из подвью

    быстрый UIActivityIndicatorView при NSURLConnection

    Вращение iPad сбрасывает анимацию просмотров назад, чтобы начать

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