您好,登錄后才能下訂單哦!
在聲明一個變量的時候,經常有使用下面的三種形式:
@interface testView : UIView
{
//1、內部變量,外部不能訪問
UIButton *button1;
//3、聲明變量,同時聲明了一個同名變量屬性
UIButton *button3;
}
//2、聲明一個屬性,從Xcode4.5開始,使用@property關鍵字將自動生成setter和getter方法,不用@synthesize關鍵字
@property (nonatomic, strong) UIButton *button2;
//
@property (nonatomic, strong) UIButton *button3;
@end
第一種方式聲明的變量是一個內部變量,只能在該類中被訪問,在類的外部是不能訪問的。因此,這樣的變量最好不要在.h文件中去聲明,應該放在.m文件中。
第二種方式聲明了一個屬性,從Xcode 4.5以后,不用使用@synthesize關鍵字就自動生成了該屬性的setter和getter方法。
第三種方法是在聲明一個變量的時候,同時聲明了一個與變量同名的屬性。這時候,如果不使用@synthesize關鍵字,會產生一個警告信息。
這種情況讓我很迷惑,通過寫了一個簡單的demo測試了一番,現在將我的分析結果總結一下。
先上代碼:
@synthesize button3 = _button3;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
//button1
button1 = [[UIButton alloc] initWithFrame:CGRectMake(20, 10, 75, 44)];
button1.backgroundColor = [UIColor redColor];
[button1 setTitle:@"button1" forState:UIControlStateNormal];
[self addSubview:button1];
//button2
_button2 = [[UIButton alloc] initWithFrame:CGRectMake(20, 64, 75, 44)];
_button2.backgroundColor = [UIColor greenColor];
[_button2 setTitle:@"button2" forState:UIControlStateNormal];
[self addSubview:_button2];
//button3
button3 = [[UIButton alloc] initWithFrame:CGRectMake(20, 118, 75, 44)];
button3.backgroundColor = [UIColor blueColor];
[button3 setTitle:@"button3" forState:UIControlStateNormal];
[self addSubview:button3];
_button3.backgroundColor = [UIColor grayColor];
[_button3 setTitle:@"button3_1" forState:UIControlStateNormal];
_button3 = [[UIButton alloc] initWithFrame:CGRectMake(20, 172, 75, 44)];
_button3.backgroundColor = [UIColor grayColor];
[_button3 setTitle:@"button3_1" forState:UIControlStateNormal];
[self addSubview:_button3];
}
return self;
}
通過@synthesize關鍵字我先把警告信息屏蔽掉了,button1是一個供內部訪問的變量,button2是可供外部訪問的,這都沒什么,重點是button3。
通過代碼可以發現,我分別對button3和_button3進行了初始化,并設置了button的title和背景顏色。在對button3初始化完成后,我希望能通過_button3去修改button3的背景顏色和title。實際運行效果如下圖:
_button3對button3的修改無效!為什么這樣?我的理解是button3是供內部訪問的變量,_button3是一個可供外部訪問的屬性,即使我通過@synthesize button3 = _button3進行設置,也是對@property (nonatomic, strong) UIButton *button的設置。因此我得出結論:button3和_button3是完全獨立的,第三種聲明方式是無意義的。
接著測試,我在另外一個文件中引入我的測試文件,并實例化了一個對象希望對button們進行訪問,上代碼:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
testView *view = [[testView alloc] initWithFrame:CGRectMake(10, 50, 300, 250)];
[view.button2 setTitle:@"按鈕2" forState:UIControlStateNormal];
[view.button3 setTitle:@"按鈕3" forState:UIControlStateNormal];
[self.view addSubview:view];
}
運行效果如圖:
通過測試分析最終得出的結論如下:
1、聲明一個內部使用變量,在.m文件中聲明即可。(使用@interface { }或@property均可)。
2、聲明一個可供外部訪問的屬性,在.h文件中使用@property即可。
PS:第一次原創寫blog,才發現寫東西這么難啊!
理解不一定對,希望大家輕噴,多指點!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。