Как я могу получить NSNumber, не выполняя для него alloc, чтобы он отвечал на initWithInt?

Насколько я понимаю, «удобный» метод, такой как [nsnumber initWithInt], должен создавать копию указанного класса, инициализированную желаемым значением.

minutesLeft=[NSNumber initWithInt:((timeLeft)%60)];

Timeleft является целым числом, поэтому initWithInt должен работать, а в результате minutesLeft (свойство, заданное для сохранения) должен получать, а затем сохранять новый NSNumber. Проблема в том, что по какой-то причине я получаю предупреждение о том, что «NSNumber может не отвечать на + initWithInt». Поскольку указанное свойство настроено на сохранение, я не хочу использовать [nsnumber alloc] initwithint, потому что тогда мне придется его освободить.

Любые идеи?


person RonLugge    schedule 05.09.2010    source источник


Ответы (2)


Вы имеете в виду: [NSNumber numberWithInt:number]; Имейте в виду, что это значение автоматически выпускается, поэтому вам может потребоваться его сохранить. Если вы используете Mac, не беспокойтесь об этом.

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

http://cocoadevcentral.com/d/learn_objectivec/

person Justin Meiners    schedule 05.09.2010
comment
на самом деле это в значительной степени именно то, что я искал. Это нормально, что номер, о котором идет речь, автоматически высвобождается, потому что я использую @property (неатомный, сохранить), поэтому указатель будет обрабатывать сохранение / освобождение для меня. - person RonLugge; 05.09.2010
comment
Хорошо, круто, хотите нажать на галочку слева от этого, чтобы показать, что на этот вопрос был дан ответ? - person Justin Meiners; 05.09.2010
comment
@ Джастин, почему бы ему не беспокоиться об этом, если он на Mac? - person Carl Norum; 05.09.2010
comment
@Carl Norum Сборка мусора обычно включена, если вы создаете приложение для Mac, тогда как, если бы он был на iPhone, сборка мусора отсутствует, и вам нужно беспокоиться о сохранении и тому подобном. - person Justin Meiners; 05.09.2010
comment
@Justin Я бы с удовольствием нажал на него; к сожалению, эта штука заставляет меня ждать 8 минут ... что обычно составляет около 7 минут ПОСЛЕ того, как я уже подтвердил, что «это работает» ... Так что вам придется ждать дольше, чем следовало бы. Прости. - person RonLugge; 05.09.2010
comment
@RonLugge Нет проблем, он просто сказал, что вы задали только 2 вопроса, поэтому я подумал, может быть, вы не знаете, как это работает, моя проблема. - person Justin Meiners; 05.09.2010
comment
@ Джастин, наверное, отличная идея, неплохо - person RonLugge; 05.09.2010

Поскольку создатели удобства не всегда доступны, то есть:

self.minutesLeft = [NSNumber numberWithInt:number];

другой шаблон является обычным, если вы хотите, чтобы объект был автоматически выпущен, когда нет доступного средства создания удобства:

self.minutesLeft = [[[NSNumber alloc] initWithInt:number] autorelease];

или наконец

NSNumber * n = [[NSNumber alloc] initWithInt:number];
self.minutesLeft = n;
[n release], n = 0;

Более того, я считаю хорошей идеей предположить, что новый код должен быть написан таким образом, чтобы он был совместим с управляемой памятью (а не сборщиком мусора). Отслеживание объекта, для которого был отправлен дополнительный автозапуск, может занять ужасно много времени, если вы когда-нибудь будете использовать программу в контексте управляемой памяти. Вероятно, будет много ошибок, которые сложно отследить или воспроизвести (включая серьезные утечки). Написание интерфейсов / подпрограмм для подсчета ссылок должно быть второй натурой - это очень легко написать, когда вы пишете класс, в отличие от того, чтобы добавлять его позже (читайте: вам придется прочитать много кода, что отнимает очень много времени) - тогда вам придется тестировать, тестировать, тестировать все обновленные программы.

person justin    schedule 05.09.2010
comment
Согласованный; в то время как сборка мусора имеет свое время и место, разработка для iPhone, вероятно, не так уж важна. - person RonLugge; 05.09.2010