gpt4 book ai didi

ios - 在哪里声明多次调用的方法的变量

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:06:25 25 4
gpt4 key购买 nike

我在 tableViewcellForRowAtIndexPath: 方法中调用了以下方法。

- (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 中声明 equalizer,因为我在两种方法中都访问了它。然而,对于所有名为 frame1, frame2, ..., frame10UIImage,我不确定声明的最佳位置在哪里,因为它们只被使用在该方法中,但每次在 cellForRowAtIndexPath: 中调用该方法时都声明它们似乎不是内存高效的,虽然我不确定是否在 header 中公开声明它们是更好的选择。

哪个更好更高效?


我是如何最终真正解决这个问题的:

感谢所有回答的人,我结合了@Antonio 和@x4h1d 的回答如下:

@implementation MyClass
static NSMutableArray *imageArray;
static UIImage *frame;

然后是+(void)initialize方法:

+ (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;
}
}

然后在我的 cellForRowAtIndexPath: 方法中为 tableView 设置了这一点:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com