類和對象
OC語言中的方法
方法:
類的功能代碼,在(.h)文件中聲明,在(.m)文件中實現。
語法:
-|+(返回類型)方法名:參數列表
{
//方法體
}
(—)表示:實例方法,
(+)表示:類方法。
-(void)sayHello; //實例方法
1. (void)sayHelloName:(NSString *)name
Age:(NSInteger )age; //無返回值有參數的實例方法
+(void)sayHi; //無返回值的類方法
+(void)hiGuys;
注意:
1.類方法可以調用類方法
2.類方法不可以調用實例方法,但是類方法可以通過判斷實例對象來訪問實例方法;
3.類方法不可以使用實例變量。類方法可以使用self,因爲self不是實例變量;
4.類方法作爲消息,可以被髮送到類裏面去,不能發送到
首先,在.h文件中聲明我們要使用的對象和方法;
{
NSString *_name;
NSInteger _age;
NSString *_hobby;
}
-(void)sayHello; //實例方法
- (void)sayHelloName:(NSString *)name
Age:(NSInteger )age; //無返回值有參數的實例方法
+(void)sayHi; //無返回值的類方法
+(void)hiGuys;
然後我們在.m文件中寫入無返回無參數的實例方法、無返回值有參數的實例方法,以及無返回值的類方法;
-(void)sayHello{
NSLog(@"sayHello");
}
-(void)sayHelloName:(NSString *)name Age:(NSInteger)age
{
NSLog(@"Hello guys!My name is %@.I am %ld years old.",name,age);
}
+(void)sayHi{
NSLog(@"sayHi");
}
+(void)hiGuys
{
//1.類方法可以調用類方法
//self是什麼?self 當前對象的指針
[self sayHi];
//2.類方法不可以調用實例方法,但是類方法可以通過創建實例對象來訪問實例方法
Person* person=[Person new];
[person sayHello];
// 3.類方法不可以使用實例變量。類方法可以使用self,因爲self不是實例變量
// NSLog(@"name:%@ ,age:%ld ,hobby:%@",_name,_age,_hobby);
最後我們在主函數中引用一下我們剛剛創建的幾個方法,這裏重點要 標註一下 [person sayHelloName:@”Aaaa” Age: 25];這種帶參數的方法;這種是很多方法的一種通用形式,後面很多特殊的函數以及構造器都是和這種方法相像的,一定要先去理解這種參數的意義。(與C的指針有一點相關)
Person* person =[Person new];
[person sayHello];
[person sayHelloName:@"Aaaa" Age: 25];
[Person sayHi];
[Person hiGuys];
設置器與訪問器
設置器和訪問器的作用
1.隱藏了實例變量
2.控制變量的讀寫;
3.做正確性校驗;
(主要就是用來設置和訪問@protected和@private作用域的值)
設置器(setter)和訪問器(getter)的規命名規則
1.設置器:-(void)set首字母大寫的實例變量:(實例變量的返回值類型)去掉下劃線的實例變量名;
2.訪問器 :-(實例變量的返回值類型)去掉下劃線的實例變量;
note:
對於類的名稱,其首寫字母大寫
對於變量,其首寫字母小寫
遵循駝峯命名規則。
在.h文件中我們對設置器與訪問器進行編寫,其實通過設置器和訪問器我們不難發現,設置器與訪問器其實也是一種方法,所以
我們可以把設置器看作:無返回值有參數的實例方法;訪問器看作有返回值無參數的實例方法;這樣來看的話,在.m文件中我們也可以很容易理解其中的內容。
{
//@protected
NSString *_name;
NSInteger _age;
NSString *_hobby;
}
//設置器與訪問器
//對於_name屬性的設置器
-(void)setName:(NSString*)name;
//name訪問器
-(NSString *)name;
//對於_age屬性的設置器
-(void)setAge:(NSInteger)age;
//age訪問器
-(NSInteger)age;
//對於_hobby屬性的設置器
-(void)setHobby:(NSString*)hobby;
//hobby訪問器
-(NSString *)hobby;
在.m文件中,我們進行設置器和訪問器的書寫,設置器就是將引入的參數的值賦值給實例變量,訪問器就是將需要的實例變量的值返回回去:
-(void)setName:(NSString*)name{
_name= name;
}
-(NSString *)name{
return _name;
}
//做正確性校驗
-(void)setAge:(NSInteger)age
{
if(_age>=0|_age<18){
_age = 18;
}else if(_age < 0){
NSLog(@"請重新輸入正確的年齡");
}else{
_age = age;
}
}
-(NSInteger)age{
return _age;
}
-(void)setHobby:(NSString *)hobby{
_hobby= hobby;
if([_hobby isEqualToString:@"play LOL"]){
_hobby=@"niuB";
}else{
_hobby=@"lowB";
}
}
-(NSString *)hobby{
return _hobby;
}
在主函數main.m中,我們可以建立一個stu的對象,然後對其調用設置器,以及使用訪問器訪問我們需要的數據,看一下最終效果:
Student* stu=[Student new];
[stu setName:@"Jack"];
[stu setAge:25];
[stu setHobby:@"play LOL"];
NSString *name=[stu name];
NSInteger age =[stu age];
NSString *hobby=[stu hobby];
NSLog(@"name =%@ ,age= %ld ,hobby=%@",name ,age,hobby);
運行結果爲:
便利初始化函數與便利構造器
- id:返回的類型是id數據類型,它是動態數據類型,可一直指向任何類的對象,而不關心其具體類型,在運行時檢查其具體類型,可以對其發送任何(存在的)消息。
- self:指當前對象的指針。
- super:指向父類對象的指針,子類使用super發送消息的時候,實際上就是告訴子類調用父類的方法。如果父類沒有定義該方法,則繼續在繼承鏈上查找,直到尋找到位置,如果找到NSOject的位置還沒有找到,就會報錯。
便利構造器
便利構造器只不過是把對象分配內存 和 調用便利初始化函數初始化對象的代碼封裝起來,讓用戶使用起來更加方便。
我們知道alloc的作用是爲建立的對象分配空間,而init 的作用是爲建立的對象的變量進行初始化,而如果我們對變量的值有要求的時候,我們就可以通過重寫init 進行自定義初始化函數。
便利初始化函數可以通過方法-(id)init進行全局定義;
而有時候我們只需要個別改變的話,我們就可以通過使用-(id)initWithName
而對alloc以及-(void)initWithName進行封裝的話,就形成了便利化構造器。
這是.h文件的代碼:
@interface Teacher : NSObject
{
NSString *_name;
NSInteger _age;
NSString *_hobby;
}
-(void)sayWord;
//便利初始化函數
//注意命名規範:init開頭
-(id)initWithName:(NSString *)name
Age:(NSInteger)age;
+(id)teacherWithName:(NSString *)name Age:(NSInteger)age;
這是.m文件的代碼:
-(void)sayWord{
NSLog(@"name= %@ ,age=%ld",_name,_age);
}
-(id)init{
if(self =[super init]){
_name=@"Rick";
_age=25;
}
return self;
}
-(id)initWithName:(NSString *)name
Age:(NSInteger )age{
if(self=[super init]){
_name=name;
_age=age;
}
return self;
}
+(id)teacherWithName:(NSString *)name Age:(NSInteger)age{
//封裝起來
Teacher *teacher=[[Teacher alloc]initWithName:name Age:age];
return teacher;
}
這是主函數main.m的代碼:
// 便利初始化函數 (-) 與 便利構造器 (+)
Teacher *teacher=[[Teacher alloc]init];
[teacher sayWord];
Teacher *teacher1=[[Teacher alloc]initWithName:@"Jack" Age:25];
[teacher1 sayWord];
Teacher *teacher2=[Teacher teacherWithName:@"Rick" Age:25];
[teacher2 sayWord];