日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

OC中的类

發(fā)布時(shí)間:2023/11/30 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OC中的类 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

OC中類

OC中類的定義

在Xcode中創(chuàng)建一個(gè)新的類,會(huì)自動(dòng)給你生成兩個(gè)文件一個(gè)是.h另外一個(gè)是.m文件,你新創(chuàng)建的類默認(rèn)繼承了NSObject類,因?yàn)橛幸恍┓椒ǘ夹枰愔械姆椒ā1热鏰lloc分配內(nèi)存
OC中用來(lái)描述類的使用@interface 類名:父類來(lái)進(jìn)行定義然后用@end來(lái)定義類的結(jié)束

@interface NsFirst : NSObject{int _age;int _no; } - (void )setAge:(int)age; -(int)getAge; -(void) setNo:(int) no; -(int) getNo; @end

OC中類的實(shí)現(xiàn)

跟C++不同的一點(diǎn),OC中的類的實(shí)現(xiàn)并不能和聲明放在一起,否則編譯會(huì)報(bào)錯(cuò)。而在C++中雖然強(qiáng)調(diào)要分開(kāi)寫(xiě),但寫(xiě)到同一個(gè)文件中也并不會(huì)出錯(cuò),而在OC中就不是這樣
OC中新開(kāi)一個(gè)文件用來(lái)進(jìn)行類的實(shí)現(xiàn),用@implementation 類名開(kāi)始進(jìn)行實(shí)現(xiàn),用@end對(duì)實(shí)現(xiàn)進(jìn)行結(jié)束標(biāo)記

@implementation NsFirst -(void )setAge:(int)age{_age = age; } -(int)getAge{return _age; } -(void)setNo:(int)no{_no = no; } -(int)getNo{return _no; } @end

類的方法

對(duì)于每一個(gè)類都有靜態(tài)方法(對(duì)于類的方法)和動(dòng)態(tài)方法(對(duì)于對(duì)象的方法),C++中調(diào)用靜態(tài)方法用的是類作用域運(yùn)算符::去進(jìn)行調(diào)用,對(duì)于動(dòng)態(tài)方法通過(guò)->或者.兩個(gè)運(yùn)算法來(lái)進(jìn)行調(diào)用
而在OC中調(diào)用相應(yīng)的方法都是通過(guò)消息發(fā)送,也就是[]這個(gè)運(yùn)算符

//對(duì)于上面的類進(jìn)行相應(yīng)方法調(diào)用 id ns = [[NsFirst alloc] init]; [ns setAge:100]; NSLog(@"age is %i",[ns getAge]);

自定義構(gòu)造方法

一般我們使用的init方法是編譯器默認(rèn)的一種動(dòng)態(tài)方法,會(huì)給對(duì)象初始化為0,而有些時(shí)候我們需要初始化后進(jìn)行賦值,所以此時(shí)就需要重寫(xiě)init方法
重寫(xiě)init方法

  • 自己寫(xiě)的init方法名稱不能與系統(tǒng)一樣
  • init方法的步驟
  • 先調(diào)用基類構(gòu)造
  • 判斷是否對(duì)象是否創(chuàng)建成功,成功后進(jìn)行賦值操作
  • 返回當(dāng)前對(duì)象self
  • @interface Student : NSObject @property int age; @property int no; //自己寫(xiě)一個(gè)構(gòu)造方法 -(id)initWithAge:(int)age :(int)no; @end@implementation Student -(id)initWithAge:(int)age :(int)no{//首先調(diào)用super的init的方法 //判斷是否初始化成功if(self = [super init]){//賦值self.age = age;self.no = no;} //返回return self; } @end

    打印對(duì)象信息時(shí)的description方法

    關(guān)于多文件編譯

    OC中可以有多個(gè).h和.m文件,但入口函數(shù)都是main函數(shù),而且OC中沒(méi)有命名空間,所以兩個(gè)文件中的類名是可能重名的,所以我們盡可能命名使類名不能出現(xiàn)重名的情況。

    點(diǎn)語(yǔ)法

    C++中如果定義了對(duì)象,可以通過(guò)對(duì)象名.的方式對(duì)對(duì)象中屬性進(jìn)行操作,在OC中也提供了這種類似的方式
    OC中的點(diǎn)語(yǔ)法要去使用的話,必須要有相應(yīng)的set方法且set方法設(shè)置的屬性必須與點(diǎn)語(yǔ)法后的屬性名匹配

    @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; //這里就相當(dāng)于調(diào)用setAge方法,但注意setAge方法只能對(duì)age這一個(gè)屬性進(jìn)行操作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

    在寫(xiě)OC中如果給每個(gè)屬性都寫(xiě)上get和set方法,顯得代碼太過(guò)于冗余,可以使用@propety來(lái)定義成員變量,這樣編譯器就可以自動(dòng)為我們進(jìn)行set方法和get方法的聲明

  • @propety = 聲明set和get方法
  • @synthesize = 實(shí)現(xiàn)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默認(rèn)聲明與其同名的成員變量的set和get方法
    使用@propety聲明變量后編譯器自動(dòng)幫助我們聲明成員變量,我們就不用再手動(dòng)聲明變量。自動(dòng)生成的變量為私有的.
    @synthesize 實(shí)現(xiàn)的成員變量如果沒(méi)有顯示定義,則會(huì)隱式創(chuàng)建一個(gè)與其名稱相同的變量,若是想要其生成的方法是我顯示定義的方法,則需指定實(shí)現(xiàn)具體的哪個(gè)變量

    @synthesize age = _age

    目前版本中,一但使用@propety聲明了變量,編譯器會(huì)自動(dòng)幫助我們生成@synthesize,自動(dòng)幫我們實(shí)現(xiàn)
    如果我們覺(jué)的編譯器幫助我們生成的方法并不符合我們的預(yù)期,那么我們可以自己實(shí)現(xiàn)相應(yīng)的get方法和set方法,編譯器就不會(huì)再幫我們實(shí)現(xiàn)了,如果我們只想要get或者set兩者中的任意一個(gè)的話,我們只需要實(shí)現(xiàn)其中的任意一個(gè)就行,另外一個(gè)編譯器依舊會(huì)幫助我們實(shí)現(xiàn)

    總結(jié)

    以上是生活随笔為你收集整理的OC中的类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。