2010-09-05 3 views
3

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

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

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

Любые идеи?

ответ

4

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

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

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

+0

это в значительной степени именно то, что я искал, на самом деле. Это нормально, что число, о котором идет речь, автореализовано, потому что я использую @property (неатомный, сохраняю), чтобы указатель обрабатывал сохранение/освобождение для меня. – RonLugge

+0

Хорошо, круто хочу щелкнуть по чеке слева от этого, чтобы показать, что на этот вопрос был дан ответ? –

+0

@ Justin, почему он не должен беспокоиться об этом, если он на Mac? –

2

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

self.minutesLeft = [NSNumber numberWithInt:number]; 

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

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

или, наконец,

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

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

+0

+1 за то, что не рекомендую сбор мусора. –

+0

Согласен; в то время как сбор мусора имеет свое время и место, развитие iPhone, вероятно, не так. – RonLugge