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

标签 ios objective-c oop

我在 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 中声明均衡器,因为我在这两种方法中都访问它。但是,对于所有名为 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;
    }
}

然后是 tableViewcellForRowAtIndexPath: 方法中的这一点:

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/

相关文章:

ios - UITextView隐藏键盘

objective-c - 我可以**同时**使用具有相同所有者类的多个 nib 文件吗?

ios - 如何打印来自简单有效的 POST 方法的响应

C++使用多态数据成员的最佳实践模式

ios - 使用 NSRegularExpression 排除某些匹配项

ios - iOS11 中古怪的表格 View 部分 - UITableViewAutomaticDimension 问题

objective-c - 有人能让我了解sortedArrayUsingFunction 的工作原理吗?

oop - 多态性和多分派(dispatch)有什么区别?

java - 使用 OnClickListener() 是策略模式的示例吗?

ios - 单击自定义 uitableviewcell 中的一个 uibutton 会选择 uitableview 中的多个 uibutton