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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

id类型

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

id類型

在Objective-C 中,id 類型是一個獨特的數據類型。在概念上,類似Java 的Object 類,可以轉換為任何數據類型。換句話說,id 類型的變量可以存放任何數據類型的對象。在內部處理上,

這種類型被定義為指向對象的指針,實際上是一個指向這種對象的實例變量的指針。

例如,下面定義了一個id類型的變量和返回一個id類型的方法:

  • id?anObject; ?
  • -?(id)?newObject:?(int)?type;?
  • id 和void *并非完全一樣。下面是id在objc.h中的定義:

  • typedef?struct?objc_object?{ ?
  • Class?isa; ?
  • }?*id;?
  • 從上面看出,id 是指向struct objc_object 的一個指針。也就是說,id 是一個指向任何一個繼承了Object(或者NSObject)類的對象。需要注意的是id 是一個指針,所以在使用id的時候不需要加星號,比如,

  • id?foo=nil;?
  • 上述語句定義了一個nil 指針,這個指針指向NSObject 的任意一個子類。而“id*foo=nil;”則定義了一個指針,這個指針指向另一個指針,被指向的這個指針指向NSObject的一個子類。

    在Objective-C中,id取代了int類型成為默認的數據類型(在C語言中,int是默認的函數返回值類型),關鍵字nil 被定義為空對象,也就是值為0 的對象。關于更多的Objective-C基本類型,讀者可以參考obj/objc.h文件。

    下面舉一個應用id 類型的例子。例子中定義了兩個不同的類(一個是學生類Student,一個是會員類Member),這兩個類擁有不同的成員變量和方法。

    【例2-10】id類型應用。

    學生類頭文件Student.h的代碼如下:

  • #import?<Foundation/Foundation.h>?
  • @interface?Student?:?NSObject?{ ?
  • int?sid; ?
  • NSString?*name; ?
  • } ?
  • @property?int?sid; ?
  • @property?(nonatomic,retain)?NSString?*name; ?
  • -?(void)?print; ?
  • -?(void)?setSid:?(int)?sid?andName:?(NSString*)?name; ?
  • @end?
  • 學生類實現文件Student.m的代碼如下:

  • #import?"Student.h" ?
  • @implementation?Student ?
  • @synthesize?sid,name; ?
  • -?(void)?print{ ?
  • NSLog?(@"我的學號是:%i,我的名字是:%@",sid,name)?; ?
  • } ?
  • -?(void)?setSid:?(int)?sid1?andName:?(NSString*)?name1{ ?
  • self.sid?=?sid1; ?
  • self.name?=?name1; ?
  • } ?
  • @end?
  • 成員類頭文件Member.h的代碼如下:

  • #import?<Foundation/Foundation.h>?
  • @interface?Member?:?NSObject?{ ?
  • NSString?*name; ?
  • int?age; ?
  • } ?
  • @property?(nonatomic,retain)?NSString?*name; ?
  • @property?int?age; ?
  • -?(void)?print; ?
  • -?(void)?setName:?(NSString*)?name1?andAge:?(int)?age1; ?
  • @end?
  • 成員類實現文件Member.m的代碼如下:

  • #import?"Member.h" ?
  • @implementation?Member ?
  • @synthesize?name,age; ?
  • -?(void)?print{ ?
  • NSLog?(@"我的名字是:%@,我的年齡是%i",name,age)?; ?
  • } ?
  • -?(void)?setName:?(NSString*)?name1?andAge:?(int)?age1{ ?
  • self.name?=?name1; ?
  • self.age?=?age1; ?
  • } ?
  • @end?
  • 測試類源文件IdTest.m的代碼如下:

  • #import?<Foundation/Foundation.h>?
  • #import?"Member.h" ?
  • #import?"Student.h" ?
  • int?main?(int?argc,?const?char?*?argv[])?{ ?
  • NSAutoreleasePool?*?pool?=?[[NSAutoreleasePool?alloc]?init]; ?
  • Member?*member1?=?[[Member?alloc]init]; ?
  • [member1?setName:@"Sam"?andAge:36]; ?
  • id?data; ?
  • data?=?member1; ?
  • [data?print]; ?
  • Student?*student1?=?[[Student?alloc]init]; ?
  • [student1?setSid:1122334455?andName:@"Lee"]; ?
  • data?=?student1; ?
  • [data?print]; ?
  • [student1?release]; ?
  • [member1?release]; ?
  • [pool?drain]; ?
  • return?0; ?
  • }?
  • 【程序結果】

  • 我的名字是:Sam,我的年齡是36 ?
  • 我的學號是:1122334455,我的名字是:Lee?
  • 我們為這兩個類分別創建了對象student1 和member1,并利用各自的設置方法設置了各自的屬性值,然后創建了一個名為data 的id 類型對象,由于id 類型的通用性質,我們可以將創建好的對象賦值給data。

  • data?=?member1; ?
  • [data?print]; ?
  • ....... ?
  • data?=?student1; ?
  • [data?print];?
  • 當上述第一條語句執行的時候,data 被轉換成為了Member 類型的對象member1,轉換完成后,就可以調用member1 的方法print,通過程序結果證明轉換是成功的。student1 的轉換過程于member1類似。

    轉載于:https://www.cnblogs.com/iOS-mt/p/4090548.html

    總結

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

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