Предупреждение Xcode "Результаты доступа к свойствам не используются - геттеры не должны использоваться для побочных эффектов"
Я получаю это предупреждение, когда я вызываю локальную процедуру.
Мой код:
-(void)nextLetter {
// NSLog(@"%s", __FUNCTION__);
currentLetter ++;
if(currentLetter > (letters.count - 1))
{
currentLetter = 0;
}
self.fetchLetter;
}
Я получаю предупреждение в инструкции self.fetchLetter.
Эта процедура выглядит следующим образом:
- (void)fetchLetter {
// NSLog(@"%s", __FUNCTION__);
NSString *wantedLetter = [[letters objectAtIndex: currentLetter] objectForKey: @"langLetter"];
NSString *wantedUpperCase = [[letters objectAtIndex: currentLetter] objectForKey: @"upperCase"];
.....
}
Я предпочитаю исправлять предупреждающие сообщения, есть ли лучший способ написать это?
Спасибо!
Ответы
Ответ 1
Точечная нотация (т.е. self.fetchLetter
) предназначена для свойств, а не для произвольных методов. self.fetchLetter
интерпретируется как "получить свойство" fetchLetter "для" я "," это не то, что вы намереваетесь ".
Просто используйте [self fetchLetter]
вместо этого.
Ответ 2
В новых версиях Xcode даже [object method];
может вызывать предупреждение. Но иногда нам действительно нужно вызывать свойство и отбрасывать результат, например, при работе с контроллерами представлений, и мы должны убедиться, что представление действительно загружено.
Итак, мы делали:
// Ensure view is loaded and all outlets are connected.
[self view];
Это также приводит к тому, что предупреждение "Недопустимый результат доступа к ресурсам не используется, а не для предупреждения побочных эффектов". Решение заключается в том, чтобы компилятор знал, что это сделано намеренно, путем литья типа результата в void:
(void)[self view];
Ответ 3
Вы объявляете fetchLetter, используя синтаксис, подобный этому?
@property (retain) id fetchLetter;
Это выглядит неправильно для того, что вы делаете. Свойства предназначены для использования в качестве переменных аксессуаров, которые (в случае геттеров) не имеют побочных эффектов.
Вы должны объявить fetchLetter как метод, например:
- (void) fetchLetter;
и получить доступ к нему, используя:
[self fetchLetter]
Ответ 4
Я только что решил проблему, в моем случае проект CoreLocation, используя оба ответа от Tom и Chris -
Я заявляю:
@property (strong, nonatomic)CLLocationManager *locationManager;
И реализовано как:
@synthesize locationManager = _locationManager;
....
- (void) dealloc {
[self locationManager];
}