OC第二天—封装

简介:

/.锁定头文件的方法

1. 打开终端

2. 进入到Xcode的目录, 命令: cd /Applications/Xcode.app

3. 把系统头文件修改为只读, 命令: sudo chown -hR root:wheel Contentss

4. 好处:防止误删,误改头文件!

__________________________________________________________________

2、封装

封装的目的:就是为了达到高内聚低耦合;

内聚:模块内部各部分之间的关联程度;

耦合:模块与模块之间的关联程度;

内聚和耦合有一个条件改变,必然会导致另一个条件改变(耦合低了,内聚必然增高)(eg:甲乙城市的例子);

Person.h

@interface Person : NSObject

//实例变量
{
//实例变量可见度修饰的实例变量范围:从书写的哪一行开始,到下一个修饰符结束,或者碰到大括号结束;
@public

NSString *_name;

@protected//被protected被保护的, 修饰的实例变量只能在内部和子类中直接访问。直接就是通过实例变量名来访问
NSInteger _age;
NSString *_sex;

@private //私有的,被private 修饰的实例变量 只能在类的内部直接访问 子类中也不可以访问

NSString *_clour;}

//被protected修饰的实例变量不能在类的外边访问,这时需要给这些实例变量增加赋值的方法

//设置器 set 方法

//设置器的书写格式

1>对象方法 以 - 号开头

2>返回值类型一定是void
3>方法名一定以set 开头,后面跟上实例变量去掉下划线并且首字母大写

4>一定有参数,并且参数类型要和实例变量的类型保持一致,参数名就是实例变量去掉下划线

//age 的setter 方法

- (void)setAge:(NSInteger )age;

//访问器 get 方法

- (NSInteger)age;

//声明_sex的get方法

- (NSString *)sex;

- (void)setClour:(NSString *)clour;

- (NSString *)clour;

访问器的书写格式:
1>对象方法,以 - 开头
2>一定有返回值,且返回值类型要和实例变量的类型保持一致
3>方法名实例变量去掉下滑线

*/

//声明_sex的getter方法

- (void)setSex:(NSString *)sex;

Person.m

@implementation Person
- (void)setAge:(NSInteger )age{
//通过外界传输的参数给实例变量赋值

_age = age;

}
- (void)setSex:(NSString *)sex{
_sex = sex;
}
- (NSInteger)age{
//get方法返回的是实例变量
return _age;

}

- (NSString *)sex{
//get方法返回的是实例变量
return _sex;

}

//@private的访问

- (void)setClour:(NSString *)clour{
_clour = clour;
}
- (NSString *)clour{

return _clour;

}

@end

main.m

Person *p = [[Person alloc]init];

p ->_name = @"索宁师妹";


//调用_age 的setter方法

[p setAge:18];

//调用_sex的setter方法

[p setSex:@"妖"];


//调用_age的getter方法

NSInteger pAge = [p age];

//这两种都可以

NSLog(@"年龄:%ld",pAge);
NSLog(@"年龄是:%ld",[p age
]);
//调用_sex的getter方法
NSString *pSex = [p sex];
NSLog(@"性别是:%@",pSex);

NSLog(@"性别是:%@",[p sex]);

// p ->_clour = @"黄种人”; error!!!

[p setClour:@"绿色"];

NSLog(@"%@",[p clour]);

3、 总结三种实例变量的可见度

系统默认的实例变量可见度修饰符:@protected

@public 修饰的实例变量虽然可以在类的内部直接访问,但是它破坏了类的封装思想,所以以后祥哥建议不要使用

4、点语法:

1》点语法后面有赋值运算符(=)的时候调用的是实例变量的 setter 方法,后面没有赋值运算符(=)的时候用的是实例变量的getter 方法;

2》点语法知识系统提供一种快速调用setter 和getter 方法的快捷方式,只有写了实例变量的 setter 和 getter 方法才能使用点语法;

Student.h

@interface Student : NSObject
//实例变量
{
NSString *_name;//名字
NSString *_sex;//性别
NSString *_clour;//肤色
NSInteger _age;//年龄
CGFloat _weight;//体重 可以设置只写的
// @private
NSInteger _number;//学号 可以设置只读的
}
//重写父类的init方法

- (id)init;

//由于学号不允许学生修改,此时值提供getter 方法

- (NSInteger)number;

//由于体重是学生的密码,此时只提供setter方法

- (void)setWeight:(CGFloat)weight;

Student.m

//由于学号不允许学生修改,此时值提供getter 方法
- (NSInteger)number{
return _number
;
}
//由于体重是学生的密码,此时只提供setter方法
- (void)setWeight:(CGFloat)weight{

_weight =weight;

}

main.m

NSLog(@"%ld ",stu.number);

stu.weight = 50.0;

5、类方法: 类方法的好处和使用场合:不依赖于对象,执行效率高,能使用类方法解决的问题尽量使用类方法;

//场合:当方法内不需要使用实际变量的时候,可以改为类方法;

例子:Calculator.h

@interface Calculator : NSObject
//计算两个数的和
+ (CGFloat)oneNumber : (CGFloat)number plusOtherNumber : (CGFloat)OtherNumber;
//计算两个数的和

- (CGFloat)oneNumber : (CGFloat)number plusOtherNumber : (CGFloat)OtherNumber;

@end

Calculator.m

@implementation Calculator
//计算两个数的和
+ (CGFloat)oneNumber : (CGFloat)number plusOtherNumber : (CGFloat)OtherNumber{
return number +OtherNumber;
}
//计算两个数的和
- (CGFloat)oneNumber : (CGFloat)number plusOtherNumber : (CGFloat)OtherNumber{
return number +OtherNumber;
}

@end

main.m

//调用计算器类的方法

CGFloat result = [Calculator oneNumber:34.0 plusOtherNumber:56.0];

NSLog(@"%.2lf",result);

//调用计算器的对象方法
Calculator *cal = [[Calculator alloc]init];
result = [cal oneNumber:50.0 plusOtherNumber:50.0];

NSLog(@"%.2lf",result);

6、自定义初始化条件

好处:把初始化和对实例变量的赋值结合在一起

例子:Boy.h

@interface Boy : NSObject

{ NSString *_name;//名字
NSString *_gender;//性别
NSInteger _age;//年龄

CGFloat _height;//身高}

//重写隐匿的方法

- (id)init;

//自定义初始化方法和格式

- (id)initWithName : (NSString *)name;

//完全初始化方法
//遵循小驼峰命名法
- (id)initWithName:(NSString *)name
gender : (NSString *)gender
age : (NSInteger)age

height : (CGFloat)height;

- (void)setName : (NSString *)name;

- (NSString *)name;

- (void)setGender : (NSString *)gender;

- (NSString *)gender;

- (void)setAge : (NSInteger)age;

- (NSInteger)age;

- (void)setHeight : (CGFloat)height;

- (CGFloat)height;

@end

Boy.m

@implementation Boy
- (id)init{
_name = @"俊强";
_gender = @"纯爷们";
_height = 180;
return self;
}
- (id)initWithName:(NSString *)name
gender : (NSString *)gender
age : (NSInteger)age
height : (CGFloat)height{
//使用方法中的参数给实例变量赋值
_name = name;
_gender = gender;
_age = age;
_height = height;
return self;
}
- (id)initWithName : (NSString *)name{
_name = name;
return self;
}

- (void)setName : (NSString *)name{
_name = name;
}
- (NSString *)name{
return _name;
}
- (void)setGender : (NSString *)gender{
_gender = gender;
}
- (NSString *)gender{
return _gender;
}
- (void)setAge : (NSInteger)age{
_age = age;
}
- (NSInteger)age{
return _age;
}
- (void)setHeight : (CGFloat)height{
_height = height;}
- (CGFloat)height{

return _height;

@end

main.m

Boy *b = [[Boy alloc]init];
NSLog(@"%@ %@ %ld %.2lf",b.name,b.gender,b.age,b.height);
//部分自定义
Boy *b1 = [[Boy alloc]initWithName:@"李梦"];
NSLog(@"%@ %@ %ld %.2lf",b1.name,b1.gender,b1.age,b1.height);
//全部自定义
Boy *b2 = [[Boy alloc]initWithName:@"土川" gender:@"妖" age:23 height:16];

NSLog(@"%@ %@ %ld %.2lf",b2.name,b2.gender,b2.age,b2.height);




转自:http://blog.csdn.net/qq_31810357

相关文章
|
5月前
|
Java
【Java每日一题】— —第二十一题:编程把现实生活的手机事物映射成一个标准类Phone,并定义一个测试类PhoneDemo测试Phone类的功能
【Java每日一题】— —第二十一题:编程把现实生活的手机事物映射成一个标准类Phone,并定义一个测试类PhoneDemo测试Phone类的功能
|
5月前
|
JavaScript Java 测试技术
基于Java的网上奶茶店系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的网上奶茶店系统的设计与实现(源码+lw+部署文档+讲解等)
77 0
|
5月前
|
JavaScript Java 测试技术
基于Java的电影购票系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的电影购票系统的设计与实现(源码+lw+部署文档+讲解等)
51 0
|
安全 Java 编译器
《我要进大厂》- Java基础夺命连环9问,你能坚持到第几问?(反射 | 注解 | IO )
《我要进大厂》- Java基础夺命连环9问,你能坚持到第几问?(反射 | 注解 | IO )
《我要进大厂》- Java基础夺命连环9问,你能坚持到第几问?(反射 | 注解 | IO )
|
安全 Java 编译器
《我要进大厂》- Java基础夺命连环10问,你能坚持到第几问?(异常 | 泛型)
《我要进大厂》- Java基础夺命连环10问,你能坚持到第几问?(异常 | 泛型)
《我要进大厂》- Java基础夺命连环10问,你能坚持到第几问?(异常 | 泛型)
|
安全 Java 编译器
❤️【Java】图文深入解析 继承、多态、接口(超详细,小白一看就会)❤️
看完本章文,你会学习到 包,继承,多态思想,抽象类,接口,具体看目录即可。
268 0
❤️【Java】图文深入解析 继承、多态、接口(超详细,小白一看就会)❤️
|
Java API
JDK1.8新特性(七):默认方法,真香,开动!接口?我要升级!!
interface这个关键字产生一个完全抽象的类,它根本就没有提供任何具体的实现。它允许创建者确定方法名、参数列表和返回类型,但是没有任何方法体。接口只提供了形式,而未提供任何具体实现。
238 0
JDK1.8新特性(七):默认方法,真香,开动!接口?我要升级!!
|
存储 iOS开发 C++
OC 底层知识(一):OC的本质
OC 底层知识(一):OC的本质
236 0
OC 底层知识(一):OC的本质
|
Java
编写Java程序,几个朋友到游乐场游玩,大家投票选择出行方式。使用程序来模拟这一结果。(工厂模式示例Demo)
编写Java程序,几个朋友到游乐场游玩,大家投票选择出行方式。使用程序来模拟这一结果。(工厂模式示例Demo)
172 0
编写Java程序,几个朋友到游乐场游玩,大家投票选择出行方式。使用程序来模拟这一结果。(工厂模式示例Demo)