Является ли NSNumber излишним для счетчика уровня экземпляра?
-
06-09-2019 - |
Вопрос
Я новичок в Objective-C и Cocoa.Я читал, что NSInteger и NSNumber предпочтительнее при работе с простыми целыми числами, потому что они являются "платформенно-безопасными" версиями примитивных числовых типов (а в случае NSNumber - обернутыми в объект).Итак, мне нужен счетчик в моем классе, который увеличивается при срабатывании NSTimer.На форуме Apple я нашел группу людей, которые рекомендовали кому-то в подобной ситуации объявить указатель NSNumber в заголовке, инициализировать его с помощью numberWithInt: , а затем каждый раз, когда его нужно увеличивать, делайте это, присваивая его новому объекту (что-то вроде counter = [NSNumber numberWithInt:[counter intValue]+1];
).По-моему, это выглядит излишеством.Если все, что мне нужно, это счетчик int (и, кстати, я сбрасываю его обратно на 0 после того, как он достигнет 15, так что размер не является проблемой), могу ли я обойтись простым использованием int и не выделять новый объект с каждой итерацией цикла моего таймера?
И если да, то как мне сделать примитивный тип доступным во всем моем классе.Я знаю, что с типами объектов я объявляю их в своем интерфейсе и использую @property и @synthesize ... какой эквивалент (если он существует) при работе с примитивами?
Решение
Использование NSNumber для простого счетчика действительно выглядит немного перебором.Вы можете объявить члены класса как NSInteger и просто обновить их, используя ++ или +=
например:
@interface YourViewController : UIViewController {
NSInteger counter;
}
@property (nonatomic,assign) NSInteger counter;
@synthesize - это просто:
@synthesize counter
и может быть увеличен либо на:
self.counter += 1;
или
counter ++;
более позднее не позволит информировать каких-либо наблюдателей, поэтому может быть нежелательным.
Другие советы
NSNumber - это объектное представление числа.Я использую его при хранении чисел в классе collection, потому что они могут содержать только указатели на объекты.
Так что в вашем примере, которому нужен счетчик, это, вероятно, излишество.
NSInteger - это просто целое число, которое определено как безопасное для 32- и 64-разрядных программ и рекомендовано Apple для использования вместо int
.Это не объект.Вероятно, это то, что вам нужно для счетчика (на самом деле NSUInteger, который является unsigned int
) могло бы быть и лучше.
Что касается того, чтобы сделать примитивы доступными во всем вашем классе - ну, если вы объявите их в заголовке как iVar, они в любом случае будут доступны во всем вашем классе. @property
и @synthesize
это просто способы Objective-C 2.0 объявить их как свойства, которые можно увидеть (и, возможно, изменить) за пределами вашего класса в соответствии с KVC / KVO.Примитивные типы могут быть использованы в качестве свойств с использованием того же @property
и @synthesize
синтаксис.
Я использую NSInteger
(не int, чтобы быть более переносимым), и оберните его в NSNumber
если мне нужно добавить его в коллекцию (например, в NSMutableDictionary
при сохранении состояния при выходе из приложения).
Я согласен с вашим инстинктом, использование объекта для простого счетчика звучит как перебор и добавит ненужное количество вызовов отправки сообщений для простого увеличения счетчика.Для счетчика, который не нужно хранить в коллекции или обрабатывать как объект, используйте скалярные типы языка C.
Чтобы объявить скаляр как переменную экземпляра вашего класса, просто объявите его в вашем заголовочном файле:
@interface MyClass: NSObject{
int counter;
}
@end
Если вы делай необходимо увеличить NSNumber (например, для свойства NSManagedObject) Я обнаружил, что эта категория помогла:
@interface NSNumber (Incrementer)
- (NSNumber *)increment;
@end
@implementation NSNumber (Incrementer)
- (NSNumber *)increment {
return [NSNumber numberWithInt:[self intValue]+1];
}
@end
таким образом, вы можете упростить инструкции увеличения до:
counter = [counter increment];