#import <Foundation/Foundation.h> //日期結構體 typedef struct{ int year; int month; int day; } Date; @interface School : NSObject { //@public NSString * _name; NSString * _address; Date _createTime; } - (void) introduction; @end
#import "School.h" @implementation School - (void)introduction{ NSLog(@"學校名稱:%@, 學校地址:%@, 創辦時間:%i 年 %i月 %i日", [self name], [self address], [self createTime].year, [self createTime].month,[self createTime].day); } @end
#import <Foundation/Foundation.h> #import "School.h" int main(int argc, const char * argv[]) { School * s = [School new]; s->_name = @"科技大學"; s->_address = @"XX省XX市XX區XX路XX號"; s->_createTime.year = 2045; s->_createTime.month = 13; s->_createTime.day = 34; [s introduction]; return 0; }
若是成員變量是public, 給成員變量賦值的時候, 賦予的值不受咱們的約束, 在外部能夠隨便讀寫 外界有可能賦值一些髒數據安全
封裝:ide
屏蔽內部實現的細節, 僅僅對外提供共有的方法/接口測試
好處:保證數據的安全性 將變化隔離spa
規範: 將不須要對外提供的內容都隱藏起來,把屬性都隱藏,提供公共的方法對其訪問翻譯
Getter - Setter方法:code
setter方法:對象
做用: 設置成員變量的值blog
格式:接口
1. setter方法必定是對象方法get
2. 必定沒有返回值
3. 必定以set開頭, 而且set後面跟上須要設置的成員變量的名稱去掉下劃線, 而且首字母大寫
4. 必定有參數, 參數類型必定和須要設置的成員變量的類型一致, 而且參數名稱就是成員變量的名稱去掉下劃線
//成員變量如下劃線開頭的好處,就是能夠區分局部變量和成員變量 - (void) setName: (NSString *) name{ //可在這裏添加驗證代碼對傳入的數據作驗證 _name = name; }
getter方法:
做用: 獲取成員變量的值
格式:
1. getter方法必定是對象方法
2.必定有返回值, 並且返回值必定和獲取的成員變量的類型一致
3.方法名稱就是獲取的成員變量的名稱去掉下劃線
4. 必定沒有參數
- (NSString* ) name{ return _name; }
> 一個屬性能夠只有getter方法, 沒有setter方法, 這種屬性咱們稱之爲只讀屬性
> 一個屬性也能夠只有setter方法, 沒有getter方法, 這種屬性咱們稱之爲只寫屬性
> 若是既有setter方法又有getter方法, 那麼這種屬性咱們稱之爲可讀可寫的屬性
> 一個屬性也能夠沒有getter和setter, 這種屬性咱們稱之爲私有屬性
Getter - Setter 方法的調用:
Date date = {1990, 1, 1}; School * s = [School new]; [s setName:@"test"]; [s setAddress:@"tset"]; [s setCreateTime:date]; NSLog(@"學校名:%@", [s name]);
點語法:
> 若是給屬性提供了getter和setter方法, 那麼訪問屬性就又多了一種訪問方式 , 點語法
> 點語法其實它的本質就是調用setter和getter方法
> 點語法是一個編譯器的特性, 會在程序翻譯成二進制的時候將.語法自動轉換爲setter和getter方法的調用
> 若是點語法在=號的左邊, 那麼編譯器會自動轉換爲setter方法
> 若是點語法在=號的右邊, 或者沒有等號, 那麼編譯器就會自動轉換爲getter方法
s.name = @"test"; // 等效於 [s setName:@"test"]; s.address = @"測試"; // 等效於 [s setAddress:@"測試"]; s.createTime = date; // 等效於 [s setCreateTime:date]; NSLog(@"學校名:%@, 學校地址:%@", s.name, s.address); // 等效於 NSLog(@"學校名:%@, 學校地址:%@", [s name], [s address]);
> 點語法通常用於給成員變量賦值, 若是不是給成員變量賦值通常狀況下不建議使用, 可是也能夠使用
- (void)test:(int)num{ NSLog(@"測試數據 %i", num); } s.test; // 等效於 [s test]
#import <Foundation/Foundation.h> //日期結構體 typedef struct{ int year; int month; int day; } Date; @interface School : NSObject { //@public NSString * _name; NSString * _address; Date _createTime; } -(void) setName: (NSString *) name; -(NSString* ) name; - (void) setAddress: (NSString *) address; - (NSString *) address; - (void) setCreateTime: (Date) date; - (Date) createTime; - (void) introduction; - (void) test; - (void) test: (int) num; @end #import "School.h" @implementation School -(void) setName: (NSString *) name{ //可在這裏添加驗證代碼對傳入的數據作驗證 _name = name; } - (NSString* ) name{ return _name; } - (void) setAddress: (NSString *) address{ _address = address; } - (NSString *) address{ return _address; } - (void) setCreateTime: (Date) date{ _createTime = date; } - (Date) createTime{ return _createTime; } - (void)introduction{ NSLog(@"學校名稱:%@, 學校地址:%@, 創辦時間:%i 年 %i月 %i日", [self name], [self address], [self createTime].year, [self createTime].month,[self createTime].day); } //測試點語法訪問非getter-setter方法 - (void)test{ NSLog(@"點語法調用無參對象方法"); } - (void)test:(int)num{ NSLog(@"測試數據 %i", num); } @end #import <Foundation/Foundation.h> #import "School.h" int main(int argc, const char * argv[]) { //School * s = [School new]; // s->_name = @"科技大學"; // s->_address = @"XX省XX市XX區XX路XX號"; // s->_createTime.year = 2045; // s->_createTime.month = 13; // s->_createTime.day = 34; Date date = {1990, 1, 1}; School * s = [School new]; s.name = @"test"; // 等效於 [s setName:@"test"]; s.address = @"測試"; // 等效於 [s setAddress:@"測試"]; s.createTime = date; // 等效於 [s setCreateTime:date]; NSLog(@"學校名:%@, 學校地址:%@", s.name, s.address); // 等效於 NSLog(@"學校名:%@, 學校地址:%@", [s name], [s address]); // 點語法調用無參對象方法警告信息: Property access result unused - getters should not be used for side effects s.test; // 等效於 [s test]; // 點語法調用帶參對象方法 編譯直接報錯 s.test:111; [s introduction]; return 0; }