NSMutable Array и повреждение мозга - PullRequest
2 голосов
/ 29 октября 2010

Понятно, что меня привлекли некоторые умные ответы на задницы на некоторые вопросы о костяных головах, которые я задавал в последнее время из-за моего полного неправильного понимания массивов obj c и NSMutable. Итак, я посмотрел книгу, которая у меня есть, и Google, и может показаться, что мне не следует программировать, потому что я все еще застрял.

Скажем, я зацикливаюсь на методе А, и на каждом цикле я хочу добавить двойник в массив NSMutable. Это то, что я обнаружил до сих пор.

Вы не можете помещать примитивы в массивы, поэтому я превратил свой двойник в объект NSNumber

NSNumber *newObject = [NSNumber initWithDouble:doubleNumber];

XCode предупреждает: «NSNumber» может не отвечать на «+ initWithDouble:»

и когда я его компилирую, получаю:

Завершение приложения из-за необработанного исключения «NSInvalidArgumentException», причина: '+ [NSNumber initWithDouble:]: нераспознанный селектор, отправленный в класс 0x1ffea0'

Я игнорирую это и подделываю. Кто-то сказал мне, что мне нужен метод init для массива, который имеет смысл, потому что я не хочу, чтобы это происходило в цикле. Это мой метод инициализации:

-(id) init{
    [super init];
    arrayOfTouches = [[NSMutableArray alloc] init];
    return self;
}

Мне пока не нужно пытаться добавить его в массив.

[arrayOfTouches addObject:newObject];

Будет ли это работать для распечатки массива.

NSLog(@"array: %@", touchBeginObj);

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

Спасибо за любую помощь или умные комментарии задницы.

Да, у меня есть книга по Obj-C, на самом деле 3, и да, я их читаю :)

Хороших выходных.

Ответы [ 6 ]

10 голосов
/ 29 октября 2010
NSNumber *newObject = [NSNumber initWithDouble:doubleNumber];

Вы пропустили вызов +alloc в приведенном выше коде, поэтому он выдает эту ошибку, но почему бы просто не использовать:

NSNumber *newObject = [NSNumber numberWithDouble:doubleNumber];

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

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

5 голосов
/ 29 октября 2010

Первый:

[NSNumber numberWithDouble: double]

вместо

[NSNumber initWithDouble: double]

Ваш addObject выглядит нормально.

У вас есть несколько способов напечатать ваш массив, я бы посоветовал повторить, как это будет полезно позже:

for (NSNumber *number in arrayOfTouches)
{
    NSLog(@"Number %f", [number doubleValue]);
}
3 голосов
/ 29 октября 2010

initWithDouble - это метод экземпляра, вы ищете метод класса numberWithDouble.

3 голосов
/ 29 октября 2010

Измените это:

NSNumber *newObject = [NSNumber initWithDouble:doubleNumber];

на это:

NSNumber *newObject = [NSNumber numberWithDouble:doubleNumber];

-initWithDouble - это метод экземпляра NSNumber (поэтому сначала вам нужно будет сделать [NSNumber alloc]),+numberWithDouble - это метод класса.

2 голосов
/ 29 октября 2010

Вам нужно иметь нулевое предупреждение от компилятора - вы не можете игнорировать их и «подделать». Вы боретесь с основами, у вас есть опыт работы с другими языками программирования?

Есть несколько вещей, которые вы должны знать, чтобы кодировать в Objective-c, и вы должны быть знакомы с общими концепциями объектно-ориентированного программирования. Также немного C может быть полезным, так как target-c - это расширение C, и оно может дать некоторое представление о том, почему ориентация объекта так полезна и стоит усилий.

Если вы уже знаете такой язык, как Python, Java или даже Actionscript, тогда почти все концепции одинаковы, и цель-c действительно не так уж и сложна. Вам просто нужны подробности о том, как эти понятия перевести в цель-c. Например,

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

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

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

Чтобы претендовать на владение памятью, вы отправляете метод alloc в класс.

NSNumber *myNumberVariable = [NSNumber alloc];

Чтобы установить число с начальным значением 10.0, вы отправляете сообщение initWithDouble: вашему новому экземпляру.

[myNumberVariable initWithDouble:10.0];

Для удобства они могут быть и обычно объединены в одно утверждение.

NSNumber *myNumberVariable = [[NSNumber alloc] initWithDouble:10.0];

Это самый фундаментальный аспект программирования на языке c. Вы ничего не можете сделать без глубокого понимания этого. Поиск в Google init objective-c возвращает буквально сотни учебников, руководств, шпаргалок и справки.

Если вашему собственному классу требуется свойство, инициализируемое при создании экземпляра, например, arrayOfTouches , вы должны переопределить предпочтительный метод настройки родительского класса. Если родительским классом является NSObject, предпочтительным методом настройки NSObject является init. Если вы создаете объект в своем методе установки, у вас всегда должен быть метод dealloc. Это всегда, всегда, всегда будет выглядеть так:

- (id)init {
  self = [super init];
  if(self){

  }
  return self;
}
- (void)dealloc {
  [super dealloc];
}

Изменится только имя "init", в зависимости от имени переопределяемого метода, - (id) init становится - (id) nameOfMethodIAmOverriding и [super init] становится [super nameOfMethodIAmOverriding] ;

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

- (id)init {
  self = [super init];
  if(self){
    arrayOfTouches = [[NSMutableArray alloc] init];
  }
  return self;
}
- (void)dealloc {
  [arrayOfTouches release];
  [super dealloc];
}

Слушайте, я не думаю, что у вас есть вопросы с тупыми головами, это разумные вопросы, но если у вас есть 3 книги - ответы почти наверняка есть на первых нескольких страницах каждой книги - возможно, вы собираетесь узнать это неправильно. Почему-то вы не получаете основ. Лучшее, что я могу предложить, - это идти медленнее и выполнять упражнения, описанные в книге, или выбрать более простой язык и попытаться освоить его перед переходом к цели-c.

1 голос
/ 29 октября 2010

Перейдите в Справка -> Документация разработчика

Поиск NSNumber.Под методами класса вы найдете, как создать NSNumber с двойным.

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