Является ли NSNumber избыточным для счетчика уровня экземпляра? - PullRequest
9 голосов
/ 27 мая 2009

Я новичок в Objective-C и какао. Я читал, что NSInteger и NSNumber предпочтительны при работе с простыми целыми числами, потому что они являются «безопасными для платформы» версиями примитивных числовых типов (и в случае NSNumber, обернутыми в объект). Итак, мне нужен счетчик в моем классе, который увеличивается при срабатывании NSTimer. На форуме Apple я обнаружил группу людей, которые все рекомендовали кому-то, находящемуся в похожей ситуации, что они должны объявить указатель NSNumber в заголовке, инициализировать его с помощью numberWithInt: новый объект (что-то вроде counter = [NSNumber numberWithInt:[counter intValue]+1];). Это выглядит как излишнее для меня. Если все, что мне нужно, это счетчик int (и, между прочим, я сбрасываю его обратно в 0 после того, как он достигнет 15, так что размер не проблема), я не могу сойти с рук только с использованием int и не должен выделять новый объект с каждой итерацией цикла моего таймера?

И если так, как я могу сделать примитивный тип доступным во всем классе? Я знаю, что с объектными типами я объявляю это в своем интерфейсе и использую @property и @synthesize ... каков эквивалент (если он существует) при работе с примитивами?

Ответы [ 5 ]

15 голосов
/ 27 мая 2009

Использование NSNumber для простого счетчика выглядит немного перебором. Вы можете объявить членов класса как NSInteger и просто обновить их, используя ++ или + =

например:

@interface YourViewController : UIViewController  {
NSInteger counter;      
}

@property (nonatomic,assign) NSInteger counter;

@synthesize это просто:

@synthesize counter

и может быть увеличен либо:

self.counter += 1;

или

counter ++;

позднее это предотвратит информирование любых наблюдателей, поэтому может быть не предпочтительным.

9 голосов
/ 27 мая 2009

NSNumber - это объектное представление числа. Я использую его при хранении чисел в классе коллекции, потому что они могут содержать только указатели объектов.

Так что в вашем примере, который нуждается в счетчике, он, вероятно, излишний.

NSInteger - это просто целое число, определенное по типу для обеспечения безопасности для 32- и 64-разрядных программ, которое рекомендуется Apple для использования вместо int. Это не объект. Это, вероятно, то, что вам нужно для счетчика (на самом деле NSUInteger, который unsigned int) может быть лучше.

Что касается того, чтобы сделать примитивы доступными для всего вашего класса - хорошо, если вы объявите его в заголовке как iVar, он все равно будет доступен в вашем классе. @property и @synthesize - это просто способы Objective-C 2.0 объявить их как свойства, которые можно увидеть (и, возможно, изменить) за пределами вашего класса в соответствии с KVC / KVO. Примитивные типы могут использоваться в качестве свойств с использованием одного и того же синтаксиса @property и @synthesize.

4 голосов
/ 27 мая 2009

Я использую NSInteger (не int, чтобы быть более переносимым) и заключаю его в NSNumber, если мне нужно добавить его в коллекцию (например, NSMutableDictionary при сохранении состояния при выходе из приложения). ).

1 голос
/ 27 мая 2009

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

Чтобы объявить скаляр как переменную экземпляра вашего класса, просто объявите его в заголовочном файле:

@interface MyClass: NSObject{
  int counter;
}

@end
0 голосов
/ 16 августа 2010

Если вам нужно необходимо увеличить NSNumber (например, для свойства NSManagedObject), я обнаружил, что эта категория помогла:

@interface NSNumber (Incrementer)
- (NSNumber *)increment;
@end

@implementation NSNumber (Incrementer)
- (NSNumber *)increment {
    return [NSNumber numberWithInt:[self intValue]+1];
}
@end

, чтобы вы могли упростить операторы приращения до:

counter = [counter increment];
...