我试图为初始化我的自定义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.view1
、self.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
的新实例插入到数组之后对属性没有影响。事实上,属性只是一对选择器(例如view1
和setView1:
),它本身不能可靠地与c风格的指针一起使用。
您可以使用带有UIView **
指针数组的后备变量,但是您最好重新考虑整个方法。