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

Ну, в моем случае я попробовал Решение 1 , которое все еще не работало. Затем я использовал Solution 2 вместе с Solution 1

Solution 1 Обновление текущей версии ConstraintLayout в файле уровня приложения build.gradle.

С

implementation 'androidx.constraintlayout:constraintlayout:1.1.2'

до

implementation 'androidx.constraintlayout:constraintlayout:1.1.3'

Решение 2 Недействительные кэши и перезапуск Android Studio ( Если все еще не работает после применения Решение 1 ).

Файл -> Invalidate Caches / Restart -> Invalidate and Restart

Я использовал оба из них, и это прекрасно работает для меня.

Примечание: Решение 1 важно.

9
задан Rich 27 May 2009 в 12:06
поделиться

5 ответов

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

, например:

@interface YourViewController : UIViewController  {
NSInteger counter;      
}

@property (nonatomic,assign) NSInteger counter;

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

@synthesize counter

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

self.counter += 1;

, либо

counter ++;

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

15
ответ дан 4 December 2019 в 07:35
поделиться

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

Итак, в вашем примере, где требуется счетчик, это, вероятно, излишнее.

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

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

9
ответ дан 4 December 2019 в 07:35
поделиться

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

4
ответ дан 4 December 2019 в 07:35
поделиться

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

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

@interface MyClass: NSObject{
  int counter;
}

@end
1
ответ дан 4 December 2019 в 07:35
поделиться

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

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

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

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

counter = [counter increment];
0
ответ дан 4 December 2019 в 07:35
поделиться