生活随笔
收集整理的這篇文章主要介紹了
id类型
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
id類型
在Objective-C 中,id 類型是一個獨特的數(shù)據(jù)類型。在概念上,類似Java 的Object 類,可以轉(zhuǎn)換為任何數(shù)據(jù)類型。換句話說,id 類型的變量可以存放任何數(shù)據(jù)類型的對象。在內(nèi)部處理上,
這種類型被定義為指向?qū)ο蟮闹羔?#xff0c;實際上是一個指向這種對象的實例變量的指針。
例如,下面定義了一個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類型成為默認(rèn)的數(shù)據(jù)類型(在C語言中,int是默認(rèn)的函數(shù)返回值類型),關(guān)鍵字nil 被定義為空對象,也就是值為0 的對象。關(guān)于更多的Objective-C基本類型,讀者可以參考o(jì)bj/objc.h文件。
下面舉一個應(yīng)用id 類型的例子。例子中定義了兩個不同的類(一個是學(xué)生類Student,一個是會員類Member),這兩個類擁有不同的成員變量和方法。
【例2-10】id類型應(yīng)用。
學(xué)生類頭文件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?學(xué)生類實現(xiàn)文件Student.m的代碼如下:
#import?"Student.h" ?@implementation?Student ?@synthesize?sid,name; ?-?(void)?print{ ?NSLog?(@"我的學(xué)號是:%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?成員類實現(xiàn)文件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; ?}?【程序結(jié)果】
我的名字是:Sam,我的年齡是36 ?我的學(xué)號是:1122334455,我的名字是:Lee?我們?yōu)檫@兩個類分別創(chuàng)建了對象student1 和member1,并利用各自的設(shè)置方法設(shè)置了各自的屬性值,然后創(chuàng)建了一個名為data 的id 類型對象,由于id 類型的通用性質(zhì),我們可以將創(chuàng)建好的對象賦值給data。
data?=?member1; ?[data?print]; ?....... ?data?=?student1; ?[data?print];?當(dāng)上述第一條語句執(zhí)行的時候,data 被轉(zhuǎn)換成為了Member 類型的對象member1,轉(zhuǎn)換完成后,就可以調(diào)用member1 的方法print,通過程序結(jié)果證明轉(zhuǎn)換是成功的。student1 的轉(zhuǎn)換過程于member1類似。
轉(zhuǎn)載于:https://www.cnblogs.com/iOS-mt/p/4090548.html
總結(jié)
以上是生活随笔為你收集整理的id类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。