#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; }