从属性指针数组初始化



我试图为初始化我的自定义UIView的属性写一个快捷方式,而不是逐行写出每一行,但不幸的是它没有按我预期的方式工作。

    // .h file
    @property (nonatomic, strong) UIView *view1;
    @property (nonatomic, strong) UIView *view2;
    @property (nonatomic, strong) UIView *view3;
    @property (nonatomic, strong) UIView *view4;
    // .m file
    UIView *views[] = { self.view1, self.view2, self.view3, self.view4 };
    for ( int i = 0; i < sizeof(views) / sizeof(views[0]); i++ ) {
        views[i] = [[UIView alloc] initWithFrame:self.frame];
    }
    NSLog( @"%@", self.view1 ); // prints null

这是c风格数组不允许的吗?

您对views[]的初始化看起来很好,但是一旦您这样做了

views[i] = ...

只是覆盖数组的内容。但是,不是初始化self.view1self.view2等。试着

NSLog(@"%@", views[0]);

明白我的意思。

我不会像下面这样做,但是你可以可能会这样做(未经测试):

UIView **views[] = { &self.view1, &self.view2, &self.view3, &self.view4 };
for (int i = 0; i < (sizeof(views) / sizeof(views[0]); ++i)
{
    *views[i] = [[UIView alloc] initWithFrame: self.frame];
}
NSLog(@"%@", self.view1);

我宁愿逐个初始化它们,而不使用数组。我看不出使用数组和循环有什么好处

你只是改变了数组内部的指针,self。View1指针仍然指向nil

你可以有一个视图数组作为属性:

@property(nonatomic,strong) UIView **views;

或者您可以使用键值编码,如

for(int i=1;i<5;i++){
    NSString* key = [NSString stringWithFormat:@"view%i",i];
    UIView *view = //initialize view
    [self setValue:view forKey:key];
}

在开始时调用例如self.view1将在初始化之前给出nil。所以这行

UIView *views[] = { self.view1, self.view2, self.view3, self.view4 }; 

有效地创建了一个包含4个nil的数组。

UIView的新实例插入到数组之后对属性没有影响。事实上,属性只是一对选择器(例如view1setView1:),它本身不能可靠地与c风格的指针一起使用。

可以使用带有UIView **指针数组的后备变量,但是您最好重新考虑整个方法。

最新更新