哪里初始化MutableArray?

时间:2015-08-27 12:36:09

标签: objective-c nsmutablearray

我尝试在initWithFrame中初始化/分配它,但是后来的对象不会被添加。

它只适用于我正在调用的这个方法,但每次用户刷新视图时都会调用此方法,因此它会初始化/分配一百次。 不知道为什么它不能在initWithFrame中工作。

我需要知道正确的init方式并添加..!

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

2 个答案:

答案 0 :(得分:2)

为什么不呢:

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

确保imageFilesArray是一个强大的属性。

答案 1 :(得分:0)

您最可能的问题是initWithFrame:未被调用。如果此视图来自故事板,那么您需要将其放在awakeFromNib中,因为storyboard / nib加载的对象使用initWithCoder:初始化,而不是其指定的初始化程序。

您通常不希望尝试在initWithCoder:中进行初始化,因为它过早被调用。在分配了所有IBOutlet之后调用awakeFromNib

对于有经验的开发人员来说,将初始化分解为自己的方法非常普遍:

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