- 版权声明:本文为博主原创文章,未经博主允许不得转载。
1.锁定头文件的方法
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 = @"Bobby";//调用_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:180];
NSLog(@"%@ %@ %ld %.2lf",b2.name,b2.gender,b2.age,b2.height);```