OC中類
OC中類的定義
在Xcode中創建一個新的類,會自動給你生成兩個文件一個是.h另外一個是.m文件,你新創建的類默認繼承了NSObject類,因為有一些方法都需要基類中的方法。比如alloc分配內存
OC中用來描述類的使用@interface 類名:父類
來進行定義然后用@end
來定義類的結束
@interface NsFirst : NSObject{int _age;int _no;
}
- (void )setAge:(int)age;
-(int)getAge;
-(void) setNo:(int) no;
-(int) getNo;
@end
OC中類的實現
跟C++不同的一點,OC中的類的實現并不能和聲明放在一起,否則編譯會報錯。而在C++中雖然強調要分開寫,但寫到同一個文件中也并不會出錯,而在OC中就不是這樣
OC中新開一個文件用來進行類的實現,用@implementation 類名
開始進行實現,用@end
對實現進行結束標記
@implementation NsFirst
-(void )setAge:(int)age{_age = age;
}
-(int)getAge{return _age;
}
-(void)setNo:(int)no{_no = no;
}
-(int)getNo{return _no;
}
@end
類的方法
對于每一個類都有靜態方法(對于類的方法)和動態方法(對于對象的方法),C++中調用靜態方法用的是類作用域運算符::
去進行調用,對于動態方法通過->或者.兩個運算法來進行調用
而在OC中調用相應的方法都是通過消息發送,也就是[]這個運算符
//對于上面的類進行相應方法調用
id ns = [[NsFirst alloc] init];
[ns setAge:100];
NSLog(@"age is %i",[ns getAge]);
自定義構造方法
一般我們使用的init方法是編譯器默認的一種動態方法,會給對象初始化為0,而有些時候我們需要初始化后進行賦值,所以此時就需要重寫init方法
重寫init方法
- 自己寫的init方法名稱不能與系統一樣
- init方法的步驟
- 先調用基類構造
- 判斷是否對象是否創建成功,成功后進行賦值操作
- 返回當前對象self
@interface Student : NSObject
@property int age;
@property int no;
//自己寫一個構造方法
-(id)initWithAge:(int)age :(int)no;
@end@implementation Student
-(id)initWithAge:(int)age :(int)no{//首先調用super的init的方法 //判斷是否初始化成功if(self = [super init]){//賦值self.age = age;self.no = no;} //返回return self;
}
@end
打印對象信息時的description方法
關于多文件編譯
OC中可以有多個.h和.m文件,但入口函數都是main函數,而且OC中沒有命名空間,所以兩個文件中的類名是可能重名的,所以我們盡可能命名使類名不能出現重名的情況。
點語法
C++中如果定義了對象,可以通過對象名.的方式對對象中屬性進行操作,在OC中也提供了這種類似的方式
OC中的點語法要去使用的話,必須要有相應的set方法且set方法設置的屬性必須與點語法后的屬性名匹配
@interface Person : NSObject{int _age;int _no;
}
//-(void)setAge:(int)age:(int)no;
-(void )setAge:(int)age;
-(void )setNo:(int)No;
-(int)getAge;
-(int)getNo;
@end#import "Person.h"
int main(int argc, const char * argv[]) {@autoreleasepool {// insert code here...Person* p = [[Person alloc] init];p.age = 10; //這里就相當于調用setAge方法,但注意setAge方法只能對age這一個屬性進行操作p.no = 20;
// [p setAge:10 :20];int age = [p getAge];int no = [p getNo];NSLog(@"age is %i and no is %i",age,no);}return 0;
}
@propety
在寫OC中如果給每個屬性都寫上get和set方法,顯得代碼太過于冗余,可以使用@propety來定義成員變量,這樣編譯器就可以自動為我們進行set方法和get方法的聲明
- @propety = 聲明set和get方法
- @synthesize = 實現set和get方法
@interface Property : NSObject{int age;int no;float height;
}
@property int age;
//-(void) setage:(int)newAge;
//-(int)age;
@property int no;
@property float height;
@end@implementation Property@synthesize age;
@synthesize height;
@synthesize no;
@end
如果在有很多的成員變量例如如下情況
@interface Property : NSObject{int age;int age1;int age2;
}
那么使用@propety默認聲明與其同名的成員變量的set和get方法
使用@propety聲明變量后編譯器自動幫助我們聲明成員變量,我們就不用再手動聲明變量。自動生成的變量為私有的.
@synthesize 實現的成員變量如果沒有顯示定義,則會隱式創建一個與其名稱相同的變量,若是想要其生成的方法是我顯示定義的方法,則需指定實現具體的哪個變量
@synthesize age = _age
目前版本中,一但使用@propety聲明了變量,編譯器會自動幫助我們生成@synthesize,自動幫我們實現
如果我們覺的編譯器幫助我們生成的方法并不符合我們的預期,那么我們可以自己實現相應的get方法和set方法,編譯器就不會再幫我們實現了,如果我們只想要get或者set兩者中的任意一個的話,我們只需要實現其中的任意一個就行,另外一個編譯器依舊會幫助我們實現