Является ли NSNumber излишним для счетчика уровня экземпляра?

StackOverflow https://stackoverflow.com/questions/915341

Вопрос

Я новичок в 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];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top