我在 tableView
的 cellForRowAtIndexPath:
方法中调用了以下方法。
- (void)animateTheEqualizer
{
UIImage *frame1 = [UIImage imageNamed:@"equalizer1"];
UIImage *frame2 = [UIImage imageNamed:@"equalizer2"];
UIImage *frame3 = [UIImage imageNamed:@"equalizer3"];
UIImage *frame4 = [UIImage imageNamed:@"equalizer4"];
UIImage *frame5 = [UIImage imageNamed:@"equalizer5"];
UIImage *frame6 = [UIImage imageNamed:@"equalizer6"];
UIImage *frame7 = [UIImage imageNamed:@"equalizer7"];
UIImage *frame8 = [UIImage imageNamed:@"equalizer8"];
UIImage *frame9 = [UIImage imageNamed:@"equalizer9"];
UIImage *frame10 = [UIImage imageNamed:@"equalizer10"];
// UIImageView *equalizer;
equalizer.animationImages = [[NSArray alloc] initWithObjects:frame1, frame2, frame3, frame4, frame5, frame6, frame7, frame8, frame9, frame10, nil];
[equalizer startAnimating];
}
cellForRowAtIndexPath:
方法:
{
...
equalizer = (UIImageView *) [cell viewWithTag:30];
equalizer.hidden = YES;
if (entry.audioManager && [entry.audioManager soundPlayer].isPlaying)
{
equalizer.hidden = NO;
[self animateTheEqualizer];
}
return cell;
}
我必须在 header 中声明均衡器
,因为我在这两种方法中都访问它。但是,对于所有名为 frame1、frame2、...、frame10
的 UIImage,我不确定声明的最佳位置在哪里,因为它们仅被使用在该方法中,但每次在 cellForRowAtIndexPath:
中调用该方法时声明它们似乎不具有内存效率,而我不确定在 header 中公开声明它们是否是更好的选择。
哪个更好、更高效?
我最终如何真正解决这个问题:
感谢所有回答的人,我使用了 @Antonio 和 @x4h1d 的答案组合,如下所示:
@implementation MyClass
static NSMutableArray *imageArray;
static UIImage *frame;
然后是+ (void)初始化
方法:
+ (void) initialize
{
imageArray = [[NSMutableArray alloc] init];
for(NSUInteger i = 1; i <= 10; i++)
{
UIImage *frame = [UIImage imageNamed:[NSString stringWithFormat:@"equalizer%lu",(unsigned long)i]];
if(frame)
{
[imageArray addObject:frame];
}
else
{
// handle if image is not there
}
frame = nil;
}
}
然后是 tableView
的 cellForRowAtIndexPath:
方法中的这一点:
equalizer = (UIImageView *) [cell viewWithTag:30];
equalizer.hidden = YES;
if (entry.audioManager && [entry.audioManager soundPlayer].isPlaying)
{
equalizer.hidden = NO;
[self animateTheEqualizer];
}
最佳答案
如果图像不改变,最好的方法是将它们声明为静态
@implementation MyClass
static UIImage *frame1, *frame2, *frame3, *frame4, *frame5, *frame6, *frame7, *frame8, *frame9, *frame10;
+ (void) initialize {
frame1 = [UIImage imageNamed:@"equalizer1"];
frame2 = [UIImage imageNamed:@"equalizer2"];
frame3 = [UIImage imageNamed:@"equalizer3"];
frame4 = [UIImage imageNamed:@"equalizer4"];
frame5 = [UIImage imageNamed:@"equalizer5"];
frame6 = [UIImage imageNamed:@"equalizer6"];
frame7 = [UIImage imageNamed:@"equalizer7"];
frame8 = [UIImage imageNamed:@"equalizer8"];
frame9 = [UIImage imageNamed:@"equalizer9"];
frame10 = [UIImage imageNamed:@"equalizer10"];
}
initialize
方法是一个静态构造函数,第一次使用该类时会调用它。使用静态变量的好处是它们被实例化一次,具有速度(执行一次操作)和内存(实例化一次图像)方面的固有优势。
另一种方法是静态实例化数组:
@implementation MyClass
static NSArray *_animationImages;
+ (void) initialize {
_animationImages = @[
[UIImage imageNamed:@"equalizer1"],
[UIImage imageNamed:@"equalizer2"],
[UIImage imageNamed:@"equalizer3"],
[UIImage imageNamed:@"equalizer4"],
[UIImage imageNamed:@"equalizer5"],
[UIImage imageNamed:@"equalizer6"],
[UIImage imageNamed:@"equalizer7"],
[UIImage imageNamed:@"equalizer8"],
[UIImage imageNamed:@"equalizer9"],
[UIImage imageNamed:@"equalizer10"]
];
}
然后在你的方法中:
- (void)animateTheEqualizer {
equalizer.animationImages = _animationImages;
[equalizer startAnimating];
}
我认为后一种解决方案更好,但如果 _animationImages 不需要更新(例如更改图像或其顺序),当然它是可用的。
关于ios - 在哪里声明多次调用的方法的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21933883/