2010-10-29 4 views
2

Я по понятным причинам привлек некоторые умные ответы на некоторые вопросы о головной голове, о которых я просил в последнее время из-за моего полного непонимания объектов obj c и NSMutable. Поэтому я просмотрел книгу, которую у меня есть, и Google, и, похоже, я не буду программировать, потому что я все еще застрял.NSMutable Array и повреждение головного мозга

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

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

NSNumber *newObject = [NSNumber initWithDouble:doubleNumber]; 

XCode предупреждает: 'NSNumber' может не реагировать на '+ initWithDouble:'

и когда Я скомпилировать его получить:

Нагрузочного приложение из-за неперехваченное исключение 'NSInvalidArgumentException', причина: '+ [NSNumber initWithDouble]: непризнанный селектор послал к классу 0x1ffea0'

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

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

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

[arrayOfTouches addObject:newObject]; 

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

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

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

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

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

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

+0

IIRC, книга Hillegas имеет очень раздел о NSMutable массивах (я помню, потому что я изучал их сам только на прошлой неделе) – KevinDTimm

ответ

10
NSNumber *newObject = [NSNumber initWithDouble:doubleNumber]; 

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

NSNumber *newObject = [NSNumber numberWithDouble:doubleNumber]; 

Это autoreleased, так что вам не придется беспокоиться о его выпуске позже.

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

3

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

NSNumber *newObject = [NSNumber initWithDouble:doubleNumber]; 

к этому:

NSNumber *newObject = [NSNumber numberWithDouble:doubleNumber]; 

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

3

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

+0

Мистер Джон Франклин, облегчение, которое я почувствовал, когда мой номер напечатан в консоли. numberWithDouble. ahhhh немного облегчения Спасибо! – rd42

+0

Некоторые, как NSLog (массив @: массив @%, arrayOfTouches); все еще печатает массив: (null) – rd42

+0

Вы устанавливаете 'arrayOfTouches' в нуль где-нибудь? Вы уверены, что инициализируете 'arrayOfTouches'? 'nil' может быть передано любым сообщением и будет спокойно игнорировать его. Итак, 'NSMutableArray * foo = nil; [foo addObject: bar]; 'будет компилироваться и запускаться, но, очевидно,' bar' никогда не сохраняется. Поместите пару точек останова, один в методе 'init' (убедитесь, что он вызван), один в строке' NSLog', чтобы увидеть, вызвано ли оно до 'init'. –

5

Первое:

[NSNumber numberWithDouble: double] 

вместо

[NSNumber initWithDouble: double] 

Ваш AddObject выглядит прекрасно.

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

for (NSNumber *number in arrayOfTouches) 
{ 
    NSLog(@"Number %f", [number doubleValue]); 
} 
+0

Спасибо за заявление печати, он отлично поработал! – rd42

1

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

Искать NSNumber. В методах класса вы найдете, как создать NSNumber с двойным.

2

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

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

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

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

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

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

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

NSNumber *myNumberVariable = [NSNumber alloc]; 

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

[myNumberVariable initWithDouble:10.0]; 

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

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

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

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

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

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

только имя «Init» будет меняться, в зависимости от имени методы переопределения, - (ID) инициализация становится - (id) nameOfMethodIAmOverriding и [super init] будет [супер имяOfMethodIAmOverriding];

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

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

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

+0

Спасибо! У меня есть только опыт работы на PHP и только его использование процедурным способом. Я очень ценю время, когда вы приняли этот ответ. Еще раз спасибо! – rd42

Смежные вопросы