在哪里初始化 MutableArray?

Where to init MutableArray?

我已经尝试在 initWithFrame 中 init/alloc 它,但是对象不会被添加。

它只在我调用的这个方法中有效,但每次用户刷新视图时我都会调用这个方法,所以它 init/alloc 一百次。 不确定为什么它不能只在 initWithFrame 中工作。

我需要知道初始化和添加的正确方法..!

-(void)queryParseMethod {

self.imageFilesArray = nil;
self.imageFilesArray = [[NSMutableArray alloc]init];
[self.imageFilesArray addObjectsFromArray:objects];

if (!error) {

    for (PFObject *object in objects) {

        int index = (int)[self.favArray indexOfObject:[object objectId]];
        [self.imageFilesArray replaceObjectAtIndex:index withObject:object];

    }

    [self.favCV reloadData];
}}

为什么不只是:

if (self.imageFilesArray == nil) {
    self.imageFilesArray = [[NSMutableArray alloc] init];
    [self.imageFilesArray addObjectsFromArray:objects];
}

并确保 imageFilesArray 是强 属性。

您最有可能的问题是 initWithFrame: 没有被调用。如果这个视图来自故事板,那么你需要把它放在 awakeFromNib 中,因为 storyboard/nib-loaded 对象使用 initWithCoder: 初始化,而不是它们指定的初始化程序。

您通常不想尝试在 initWithCoder: 中进行初始化,因为它被调用得太早了。 awakeFromNib 在您所有的 IBOutlets 都被分配后被调用。

对于有经验的开发人员来说,像这样将初始化分解成自己的方法是很常见的:

- (void)setup {
   // Do your setup here
}

- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        [self setup];
    }
}

- (void)awakeFromNib {
    [self setup];
}

这样做可以确保对象在任何一种情况下都被初始化。

另一种常见的解决方案是延迟初始化,特别是对于 NSMutableArray:

@interface MyView
@property (nonatomic, readonly, strong) NSMutableArray *imageFilesArray;
@end

@implementation MyView

- (NSMutableArray *)imageFilesArray {
    if (_imageFilesArray == nil) {
        _imageFilesArray = [NSMutableArray new];
    }
    return _imageFilesArray;
}