- (NSMutableArray *)createImagesFor:(NSString *)animName withFrames:(int)numberFrames {
NSMutableArray *imageArray = [[NSMutableArray alloc] initWithCapacity:numberFrames];
for (int i = 1; i <= numberFrames; ++i) {
NSString *imageName = [[NSString alloc]initWithFormat:@"%@%i.png", animName, i];
[imageArray addObject:[UIImage imageNamed:imageName]];
[imageName release];
}
return imageArray;
}
возвращает объект imageArray
, который имеет счет сохранения +1, но не был автоматически освобожден, статический анализатор clang предупредит вас об этом, и все это связано с соглашением об именовании, поскольку ваш метод не назван как как newImagesFor...
или allocImagesFor...
или copyImagesFor...
.
NSMutableArray *imageArray;
[imageArray retain];
// sending message to nil, does nothing
imageArray = [self createImagesFor:@"jumping" withFrames:2];
// imageArray has a retain count of 1
// and it is an autoreleased object
self.animationImages = imageArray;
[imageArray release];
// retain count = 0, will be dealloc'd,
// however it is already in the autorelease pool,
// it will be over-released at the end of current event run loop
Когда вы объявляете imageArray
, это нулевой указатель на класс NSMutableArray
, отправка сообщения, в вашем случае retain
, на нулевой указатель в Objective-C возможна и не вызовет исключения.
Если вы используете средство доступа к свойству для кэширования вашего объекта imageArray
, ваше средство доступа к свойству должно быть объявлено, чтобы сохранить объект, назначенный вами
@property (retain) NSMutableArray *imageArray;
Теперь, когда ваш метод вернул автоматически освобожденный imageArray
, и у вас есть правильный метод доступа к свойствам, все, что нужно, это
NSMutableArray *imageArray;
imageArray = [self createImagesFor:@"jumping" withFrames:2];
self.animationImages = imageArray;