博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OC第二天—封装
阅读量:5756 次
发布时间:2019-06-18

本文共 5208 字,大约阅读时间需要 17 分钟。

/.锁定头文件的方法

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

你可能感兴趣的文章
阿里云PHP Redis代码示例
查看>>
php生成随机数
查看>>
2017-02-20
查看>>
win7与win7之间无法访问共享文件的问题解决(转)
查看>>
PS是LINUX下最常用的也是非常强大的进程查看命令
查看>>
插入排序
查看>>
内存管理3 - Win32汇编语言056
查看>>
一个简单的购物类网站
查看>>
限制数量不可为0,且不大于1000
查看>>
HDU1232:畅通工程(并查集)
查看>>
在Java中如何正确地终止一个线程
查看>>
linux 命令
查看>>
HttpClient 4.3教程 第六章 HTTP缓存
查看>>
【学习Android NDK开发】搭建Android SDK开发环境(Ubuntu 12.04 LTS 32-bit)
查看>>
Microsoft Visual Studio Community 2017 修改新建项目的默认位置
查看>>
什么是代码
查看>>
[程序人生]: 儿童涂鸦
查看>>
Cassandra索引详解
查看>>
字节、字、bit、byte的关系
查看>>
VMware12安装虚拟机教程、Ubuntu16.04安装教程(包括vmware tools的安装)
查看>>