Отредактировано для добавления второй альтернативы
Я не получаю это предупреждение (и не ожидала этого), когда собираю простой тестовый пример, который пытается сделать то, что вы 'повторяю.
Тем не менее, то, что вы делаете, кажется вполне разумным.Хотя у вас есть утечка в примере 'addChild'.Вы распределяете / инициализируете свой новый объект, который оставляет его с счетом сохранения 1, а затем (при условии, что «self» является UIView), ваш вызов addChild также сохранит объект, но у вас нет собственной ссылки на освобождение.
id obj = [[templateClass alloc] initWithX:positionOfChild yVariance:(random()%(rowVarianceSize+1))]];
[self addChild:obj];
[obj release], obj = nil;
Кроме того, предложение Владимира определить протокол является хорошим, и если вы это сделаете, вы даже можете вставить проверку во время выполнения, что предоставленный вам templateClass соответствует этому протоколу.
if ([templateClass conformsToProtocol:@protocol(Foo)]) {
id<Foo> obj = [[templateClass alloc] initWithX:positionOfChild yVariance:(random()%(rowVarianceSize+1))]];
[self addChild:obj];
[obj release], obj = nil;
} else {
// Do whatever you want to do if templateClass isn't correct.
// Obviously you could also have the protocol conformance check elsewhere.
}
Однако в качестве альтернативы всему этому вместо использования переменной экземпляра класса вы можете определить интерфейс для объекта фабрики, который создает определенный тип спрайта, который вы хотите.Затем передайте соответствующий экземпляр класса фабрики.
Например:
@interface Sprite : UIView {
}
- (id)initWithX:(int)pos yVariance:(int)variance;
@end
@interface SpriteFactory {
}
- (Sprite*)createSprite;
@end
Затем создайте пары подклассов: подкласс Sprite и подкласс SpriteFactory, который создает этот вид спрайта.
Тогда вместо использования вашего Class templateClass у вас будет вместо этого «SpriteFactory * factory».