Ну, в моем случае я попробовал Решение 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 важно.
Использование NSNumber для простого счетчика выглядит немного излишним. Вы можете объявить члены класса как NSInteger и просто обновить их, используя ++ или + =
, например:
@interface YourViewController : UIViewController {
NSInteger counter;
}
@property (nonatomic,assign) NSInteger counter;
@synthesize - это просто:
@synthesize counter
и может быть увеличен либо:
self.counter += 1;
, либо
counter ++;
позже будет препятствовать информированию наблюдателей, поэтому это может быть нежелательно.
NSNumber - объектное представление числа. Я использую его при хранении чисел в классе коллекции, потому что они могут содержать только указатели на объекты.
Итак, в вашем примере, где требуется счетчик, это, вероятно, излишнее.
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];