本文共 5208 字,大约阅读时间需要 17 分钟。
/.锁定头文件的方法
1. 打开终端
2. 进入到Xcode的目录, 命令: cd /Applications/Xcode.app
3. 把系统头文件修改为只读, 命令: sudo chown -hR root:wheel Contentss
4. 好处:防止误删,误改头文件!
__________________________________________________________________
2、封装
封装的目的:就是为了达到高内聚低耦合;
内聚:模块内部各部分之间的关联程度;
耦合:模块与模块之间的关联程度;
内聚和耦合有一个条件改变,必然会导致另一个条件改变(耦合低了,内聚必然增高)(eg:甲乙城市的例子);
Person.h
@interface Person : NSObject
//实例变量
{ //实例变量可见度修饰的实例变量范围:从书写的哪一行开始,到下一个修饰符结束,或者碰到大括号结束;@publicNSString *_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)ageheight : (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