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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OC中的类

發布時間:2023/11/30 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OC中的类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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兩者中的任意一個的話,我們只需要實現其中的任意一個就行,另外一個編譯器依舊會幫助我們實現

    總結

    以上是生活随笔為你收集整理的OC中的类的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。