#import <Foundation/Foundation.h>//日期結(jié)構(gòu)體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(@"學(xué)校名稱:%@, 學(xué)校地址:%@, 創(chuàng)辦時(shí)間:%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 = @"科技大學(xué)"; s->_address = @"XX省XX市XX區(qū)XX路XX號(hào)"; s->_createTime.year = 2045; s->_createTime.month = 13; s->_createTime.day = 34; [s introduction]; return 0;}
如果成員變量是public, 給成員變量賦值的時(shí)候, 賦予的值不受我們的約束, 在外部可以隨便讀寫 外界有可能賦值一些臟數(shù)據(jù)
封裝:
屏蔽內(nèi)部實(shí)現(xiàn)的細(xì)節(jié), 僅僅對(duì)外提供共有的方法/接口
好處:保證數(shù)據(jù)的安全性 將變化隔離
規(guī)范: 將不需要對(duì)外提供的內(nèi)容都隱藏起來,把屬性都隱藏,提供公共的方法對(duì)其訪問
Getter - Setter方法:
setter方法:
作用: 設(shè)置成員變量的值
格式:
1. setter方法一定是對(duì)象方法
2. 一定沒有返回值
3. 一定以set開頭, 并且set后面跟上需要設(shè)置的成員變量的名稱去掉下劃線, 并且首字母大寫
4. 一定有參數(shù), 參數(shù)類型一定和需要設(shè)置的成員變量的類型一致, 并且參數(shù)名稱就是成員變量的名稱去掉下劃線
//成員變量以下劃線開頭的好處,就是可以區(qū)分局部變量和成員變量 - (void) setName: (NSString *) name{ //可在這里添加驗(yàn)證代碼對(duì)傳入的數(shù)據(jù)做驗(yàn)證 _name = name; }
getter方法:
作用: 獲取成員變量的值
格式:
1. getter方法一定是對(duì)象方法
2.一定有返回值, 而且返回值一定和獲取的成員變量的類型一致
3.方法名稱就是獲取的成員變量的名稱去掉下劃線
4. 一定沒有參數(shù)
- (NSString* ) name{ return _name; }
> 一個(gè)屬性可以只有g(shù)etter方法, 沒有setter方法, 這種屬性我們稱之為只讀屬性
> 一個(gè)屬性也可以只有setter方法, 沒有g(shù)etter方法, 這種屬性我們稱之為只寫屬性
> 如果既有setter方法又有g(shù)etter方法, 那么這種屬性我們稱之為可讀可寫的屬性
> 一個(gè)屬性也可以沒有g(shù)etter和setter, 這種屬性我們稱之為私有屬性
Getter - Setter 方法的調(diào)用:
   Date date = {1990, 1, 1};       School * s = [School new];     [s setName:@"test"];    [s setAddress:@"tset"];    [s setCreateTime:date];        NSLog(@"學(xué)校名:%@", [s name]); 點(diǎn)語法:
> 如果給屬性提供了getter和setter方法, 那么訪問屬性就又多了一種訪問方式 , 點(diǎn)語法
> 點(diǎn)語法其實(shí)它的本質(zhì)就是調(diào)用setter和getter方法
> 點(diǎn)語法是一個(gè)編譯器的特性, 會(huì)在程序翻譯成二進(jìn)制的時(shí)候?qū)?語法自動(dòng)轉(zhuǎn)換為setter和getter方法的調(diào)用
> 如果點(diǎn)語法在=號(hào)的左邊, 那么編譯器會(huì)自動(dòng)轉(zhuǎn)換為setter方法
> 如果點(diǎn)語法在=號(hào)的右邊, 或者沒有等號(hào), 那么編譯器就會(huì)自動(dòng)轉(zhuǎn)換為getter方法
s.name = @"test"; // 等效于 [s setName:@"test"]; s.address = @"測(cè)試"; // 等效于 [s setAddress:@"測(cè)試"]; s.createTime = date; // 等效于 [s setCreateTime:date]; NSLog(@"學(xué)校名:%@, 學(xué)校地址:%@", s.name, s.address); // 等效于 NSLog(@"學(xué)校名:%@, 學(xué)校地址:%@", [s name], [s address]);
> 點(diǎn)語法一般用于給成員變量賦值, 如果不是給成員變量賦值一般情況下不建議使用, 但是也可以使用
- (void)test:(int)num{ NSLog(@"測(cè)試數(shù)據(jù) %i", num); } s.test; // 等效于 [s test]
#import <Foundation/Foundation.h>//日期結(jié)構(gòu)體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{ //可在這里添加驗(yàn)證代碼對(duì)傳入的數(shù)據(jù)做驗(yàn)證 _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(@"學(xué)校名稱:%@, 學(xué)校地址:%@, 創(chuàng)辦時(shí)間:%i 年 %i月 %i日", [self name], [self address], [self createTime].year, [self createTime].month,[self createTime].day);}//測(cè)試點(diǎn)語法訪問非getter-setter方法- (void)test{ NSLog(@"點(diǎn)語法調(diào)用無參對(duì)象方法");}- (void)test:(int)num{ NSLog(@"測(cè)試數(shù)據(jù) %i", num);}@end#import <Foundation/Foundation.h>#import "School.h"int main(int argc, const char * argv[]) { //School * s = [School new];// s->_name = @"科技大學(xué)";// s->_address = @"XX省XX市XX區(qū)XX路XX號(hào)";// 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 = @"測(cè)試"; // 等效于 [s setAddress:@"測(cè)試"]; s.createTime = date; // 等效于 [s setCreateTime:date]; NSLog(@"學(xué)校名:%@, 學(xué)校地址:%@", s.name, s.address); // 等效于 NSLog(@"學(xué)校名:%@, 學(xué)校地址:%@", [s name], [s address]); // 點(diǎn)語法調(diào)用無參對(duì)象方法警告信息: PRoperty access result unused - getters should not be used for side effects s.test; // 等效于 [s test]; // 點(diǎn)語法調(diào)用帶參對(duì)象方法 編譯直接報(bào)錯(cuò) s.test:111; [s introduction]; return 0;}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注