iOS @interface和@property聲明變量研究

        在聲明一個變量的時候,經常有使用下面的三種形式:        

        @interface testView : UIView

        {

            //1、內部變量,外部不能訪問

            UIButton *button1;

            //3、聲明變量,同時聲明瞭一個同名變量屬性

            UIButton *button3;

        }

        

        //2、聲明一個屬性,從Xcode4.5開始,使用@property關鍵字將自動生成settergetter方法,不用@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。實際運行效果如下圖:

wKiom1N9vRCAyWt3AAB_gHm1XKs722.jpg

        _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];

        }

        運行效果如圖:

wKiom1N9vSaR0SreAAB9nEA4X8w592.jpg

        通過測試分析最終得出的結論如下:

        1、聲明一個內部使用變量,在.m文件中聲明即可。(使用@interface { }或@property均可)。

        2、聲明一個可供外部訪問的屬性,在.h文件中使用@property即可。

        


        PS:第一次原創寫blog,才發現寫東西這麼難啊!

        理解不一定對,希望大家輕噴,多指點!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章