- 版權(quán)聲明:本文為博主原創(chuàng)文章孩革,未經(jīng)博主允許不得轉(zhuǎn)載。
1.鎖定頭文件的方法
1. 打開終端
2. 進(jìn)入到Xcode的目錄, 命令: cd /Applications/Xcode.app
3. 把系統(tǒng)頭文件修改為只讀, 命令: sudo chown -hR root:wheel Contentss
4. 好處:防止誤刪勉耀,誤改頭文件!```
###2疹蛉、封裝
>封裝的目的:就是為了達(dá)到高內(nèi)聚低耦合辉阶;
內(nèi)聚:模塊內(nèi)部各部分之間的關(guān)聯(lián)程度创倔;
耦合:模塊與模塊之間的關(guān)聯(lián)程度;
內(nèi)聚和耦合有一個(gè)條件改變琢歇,必然會(huì)導(dǎo)致另一個(gè)條件改變(耦合低了兰怠,內(nèi)聚必然增高)
- (eg:甲乙城市的例子):
//Person.h
@interface Person : NSObject
//實(shí)例變量
{
//實(shí)例變量可見度修飾的實(shí)例變量范圍:從書寫的哪一行開始,到下一個(gè)修飾符結(jié)束李茫,或者碰到大括號(hào)結(jié)束揭保;
@public
NSString *_name;
@protected//被protected被保護(hù)的, 修飾的實(shí)例變量只能在內(nèi)部和子類中直接訪問魄宏。直接就是通過實(shí)例變量名來訪問
NSInteger _age;
NSString *_sex;
@private //私有的,被private 修飾的實(shí)例變量 只能在類的內(nèi)部直接訪問 子類中也不可以訪問
NSString *_clour;}
//被protected修飾的實(shí)例變量不能在類的外邊訪問秸侣,這時(shí)需要給這些實(shí)例變量增加賦值的方法
//設(shè)置器 set 方法
//設(shè)置器的書寫格式
1>對象方法 以 - 號(hào)開頭
2>返回值類型一定是void
3>方法名一定以set 開頭,后面跟上實(shí)例變量去掉下劃線并且首字母大寫
4>一定有參數(shù)宠互,并且參數(shù)類型要和實(shí)例變量的類型保持一致,參數(shù)名就是實(shí)例變量去掉下劃線
//age 的setter 方法
(void)setAge:(NSInteger )age;
//訪問器 get 方法(NSInteger)age;
//聲明_sex的get方法(NSString *)sex;
(void)setClour:(NSString *)clour;
(NSString *)clour;
訪問器的書寫格式:
1>對象方法味榛,以 - 開頭
2>一定有返回值,且返回值類型要和實(shí)例變量的類型保持一致
3>方法名實(shí)例變量去掉下滑線
*/
//聲明_sex的getter方法(void)setSex:(NSString *)sex;
Person.m
@implementation Person(void)setAge:(NSInteger )age{
//通過外界傳輸?shù)膮?shù)給實(shí)例變量賦值
_age = age;
}(void)setSex:(NSString *)sex{
_sex = sex;
}(NSInteger)age{
//get方法返回的是實(shí)例變量
return _age;
}(NSString *)sex{
//get方法返回的是實(shí)例變量
return _sex;
}
//@private的訪問(void)setClour:(NSString *)clour{
_clour = clour;
}-
(NSString *)clour{
return _clour;
}
@end
main.m
Person *p = [[Person alloc]init];
p ->_name = @"Bobby";//調(diào)用_age 的setter方法
[p setAge:18];
//調(diào)用_sex的setter方法
[p setSex:@"男"];//調(diào)用_age的getter方法
NSInteger pAge = [p age];
//這兩種都可以
NSLog(@"年齡:%ld",pAge);
NSLog(@"年齡是:%ld",[p age]);
//調(diào)用_sex的getter方法
NSString *pSex = [p sex];
NSLog(@"性別是:%@",pSex);
NSLog(@"性別是:%@",[p sex]);
// p ->_clour = @"黃種人”; errorS璧2!
[p setClour:@"綠色"];
NSLog(@"%@",[p clour]);```
3券册、 總結(jié)三種實(shí)例變量的可見度
系統(tǒng)默認(rèn)的實(shí)例變量可見度修飾符:@protected
@public 修飾的實(shí)例變量雖然可以在類的內(nèi)部直接訪問频轿,但是它破壞了類的封裝思想垂涯,所以以后祥哥建議不要使用
4、點(diǎn)語法:
1》點(diǎn)語法后面有賦值運(yùn)算符(
=
)的時(shí)候調(diào)用的是實(shí)例變量的setter
方法航邢,后面沒有賦值運(yùn)算符(=
)的時(shí)候用的是實(shí)例變量的getter
方法耕赘;
2》點(diǎn)語法知識(shí)系統(tǒng)提供一種
快速調(diào)用setter 和getter
方法的快捷方式,只有寫了實(shí)例變量的setter
和getter
方法才能使用點(diǎn)語法膳殷;
//Student.h
@interface Student : NSObject
//實(shí)例變量
{
NSString *_name;//名字
NSString *_sex;//性別
NSString *_clour;//膚色
NSInteger _age;//年齡
CGFloat _weight;//體重 可以設(shè)置只寫的
// @private
NSInteger _number;//學(xué)號(hào) 可以設(shè)置只讀的
}
//重寫父類的init方法
- (id)init;
//由于學(xué)號(hào)不允許學(xué)生修改操骡,此時(shí)值提供getter 方法
- (NSInteger)number;
//由于體重是學(xué)生的密碼,此時(shí)只提供setter方法
- (void)setWeight:(CGFloat)weight;
Student.m
//由于學(xué)號(hào)不允許學(xué)生修改秽之,此時(shí)值提供getter 方法
- (NSInteger)number
{
return _number;
}
//由于體重是學(xué)生的密碼当娱,此時(shí)只提供setter方法
- (void)setWeight:(CGFloat)weight
{
_weight =weight;
}
//main.m
NSLog(@"%ld ",stu.number);
stu.weight = 50.0;
5吃既、類方法: 類方法的好處和使用場合:不依賴于對象考榨,執(zhí)行效率高,能使用類方法解決的問題盡量使用類方法鹦倚;
//場合:當(dāng)方法內(nèi)不需要使用實(shí)際變量的時(shí)候河质,可以改為類方法;
//Calculator.h
@interface Calculator : NSObject
//計(jì)算兩個(gè)數(shù)的和
+ (CGFloat)oneNumber : (CGFloat)number plusOtherNumber : (CGFloat)OtherNumber;
//計(jì)算兩個(gè)數(shù)的和
- (CGFloat)oneNumber : (CGFloat)number plusOtherNumber : (CGFloat)OtherNumber;
@end
//Calculator.m
@implementation Calculator
//計(jì)算兩個(gè)數(shù)的和
+ (CGFloat)oneNumber : (CGFloat)number plusOtherNumber : (CGFloat)OtherNumber{
return number +OtherNumber;
}
//計(jì)算兩個(gè)數(shù)的和
- (CGFloat)oneNumber : (CGFloat)number plusOtherNumber : (CGFloat)OtherNumber{
return number +OtherNumber;
}
@end
//main.m
//調(diào)用計(jì)算器類的方法
CGFloat result = [Calculator oneNumber:34.0 plusOtherNumber:56.0];
NSLog(@"%.2lf",result);
//調(diào)用計(jì)算器的對象方法
Calculator *cal = [[Calculator alloc]init];
result = [cal oneNumber:50.0 plusOtherNumber:50.0];
NSLog(@"%.2lf",result);```
###6震叙、自定義初始化條件
######好處:把初始化和對實(shí)例變量的賦值結(jié)合在一起
//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 = @"標(biāo)哥";
_gender = @"純爺們";
_height = 180;
return self;
}(id)initWithName:(NSString *)name
gender : (NSString *)gender
age : (NSInteger)age
height : (CGFloat)height{
//使用方法中的參數(shù)給實(shí)例變量賦值
_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:@"標(biāo)哥"];
NSLog(@"%@ %@ %ld %.2lf",b1.name,b1.gender,b1.age,b1.height);
//全部自定義
Boy *b2 = [[Boy alloc]initWithName:@"標(biāo)哥哥" gender:@"男" age:23 height:180];
NSLog(@"%@ %@ %ld %.2lf",b2.name,b2.gender,b2.age,b2.height);```