Ожидается, что метод вернет экземпляр своего класса
У меня есть NSTimer
который вызывается из метода класса для управления NSProgressBar
, На первый взгляд, все работает нормально, хотя я получаю предупреждение, поскольку использую NSTimer, где я предполагаю, что компилятору нужно имя класса.
Когда я ставлю имя класса MyProgressBar
на месте NSTimer
предупреждение, кажется, уходит. Реальность заключается в том, что весь ад разваливается за кулисами, и распределение памяти начинает расти вверх и вверх.
Вопрос в том, как это действительно сделать?
.час
@interface MyProgressBar : NSProgressIndicator {
double progressOffset;
NSTimer* animated;
}
@property (readwrite, retain) NSTimer* animated;
@property (readwrite) double progressOffset;
.m
- (void)setDoubleValue:(double)value {
[super setDoubleValue:value];
if (![self isDisplayedWhenStopped] && value == [self maxValue]) {
[self stopAnimation:self];
}
}
- (NSTimer*)animated { // This is the line with the warning
return animated; // using MyProgressBar ends up creating a memory leak
}
- (void)setAnimated :(NSTimer *)value {
if (animated != value) {
[animated invalidate];
animated = value;
}
}
- (id)initWithFrame :(NSRect)frameRect {
self = [super initWithFrame:frameRect];
if (self) {
self.progressOffset = 0;
self.animated = nil;
}
return self;
}
предупреждение:
Method is expected to return an instance of its class type 'MyProgressBar', but is declared to return 'NSTimer *'
Overridden method returns an instance of its class type
-> завершить проект Github здесь, который отображает предупреждение.
1 ответ
Геттер должен называться animated
не animate
,
Также вы должны использовать подчеркивание во всех ваших переменных экземпляра (шаблон по умолчанию) и отбросить метод получения / установки, так как компилятор обеспечит лучшие реализации (т.е. setAnimated
не выглядит правильно, если я вспоминаю использование ручного подсчета ссылок). Получатель должен возвращать autorelease
д объект.