从属性指针数组初始化

时间:2014-07-13 20:02:58

标签: ios objective-c arrays pointers

我正在尝试编写一个初始化我的自定义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风格的数组?

3 个答案:

答案 0 :(得分:1)

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);

我宁愿一个接一个地初始化它们,没有数组。我没有看到使用数组和循环的任何优势。

答案 1 :(得分:1)

您只是更改数组内的指针,self.view1指针仍将指向nil。

您可以将一组视图作为属性:

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

或许您可以使用Key Value Coding之类的

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

答案 2 :(得分:0)

拨打电话,例如开始时self.view1会在您初始化之前给您nil。这一行

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

有效地创建了一个包含4 nil s。

的数组

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

可以使用带有UIView **指针数组的支持ivars,但你最好重新考虑整个方法。