從前面的博文我們也可以看到,陣列和字典中只能儲存物件型別,其他基本型別和結構體是沒有辦法放到陣列和字典中的,當然你也是無法給它們傳送訊息的也就是說有些nsobject的方法是無法呼叫的,這個時候通常會用到裝箱boxing和拆箱unboxing。
其實各種高階語言基本上都有裝箱和拆 箱的過程,例如c#中我們將基本資料型別轉化為object就是乙個裝箱的過程,將這個object物件轉換為基 本資料型別的過程就是拆箱,而且在c#中裝箱的過程可以自動完成,基本資料型別可以直接賦值給object 物件。但是在objc中裝箱的過程必須手動實現,objc不支援自動裝箱。
物件的裝箱和拆箱
在objc中我們一般將基本資料型別裝箱成nsnumber型別當然它也是nsobject的子類,但是nsnumber不能對結構體裝箱,呼叫其對應的方法進行轉換:
+(nsnumber *)numberwithchar:(char)value;
+(nsnumber *)numberwithint:(int)value;
+(nsnumber *)numberwithfloat:(float)value;
+(nsnumber *)numberwithdouble:(double)value;
+(nsnumber *)numberwithbool:(bool)value;
+(nsnumber *)numberwithinteger:(nsinteger)value;
拆箱的過程就更加簡單了,可以呼叫如下方法:
-(char)charvalue;
-(int)intvalue;
-(float)floatvalue;
-(double)doublevalue;
-(bool)boolvalue;
示例
#import /*可以存放基本型別到陣列、字典*/
void test1()
int main(int argc, const char *ar**)
return 0;
}
結構體的裝箱和拆箱
上面我們看到了基本資料型別的裝箱和拆箱過程,那麼結構體呢?
這個時候我們需要引入另外乙個型別nsvalue,其實上面的nsnumber就是nsvalue的子類,它包裝了一些基本資料型別的常用裝箱、拆箱方法,當要對結構體進行裝箱、拆箱操作我們需要使用nsvalue,nsvalue可以對任何資料型別進行裝箱、拆箱操作。
事實上對於常用的結構體foundation已經為我們提供好了具體的裝箱方法:
+(nsvalue *)valuewithpoint:(nspoint)point;
+(nsvalue *)valuewithsize:(nssize)size;
+(nsvalue *)valuewithrect:(nsrect)rect;
對應的拆箱方法:
-(nspoint)pointvalue;
-(nssize)sizevalue;
-(nsrect)rectvalue;
示例
#import //nsnumber是nsvalue的子類,而nsvalue可以包裝任何型別,包括結構體
void test1() "
) */
nsvalue *value2 = [array1 lastobject];
cgpoint point2 = [value2 pointvalue];//同樣對於系統自帶的結構體有對應的取值方法(例如 本例pointvalue)
nslog(@"x=%f,y=%f", point2.x, point2.y);//結果:x=10.000000,y=20.000000
}int main(int argc, const char *ar**)
return 0;
}
自定義的結構體型別的裝箱和拆箱
如果是我們自定義的結構體型別呢,這個時候我們需要使用nsvalue如下方法進行裝箱:
+(nsvalue *)valuewithbytes:(const void *)value objctype:(const char *)type;
呼叫下面的方法進行拆箱:
-(void)getvalue:(void *)value;
示例
#import typedef struct date;
//nsnumber是nsvalue的子類,而nsvalue可以包裝任何型別,包括結構體
void test1() ;
char *type = @encode(date);
nsvalue *value3 = [nsvalue value:&date withobjctype:type];//第一引數傳遞結構體位址,第二個引數傳遞型別字串
nsarray *array2 = [nsarray arraywithobject:value3];
nslog(@"%@", array2);
/*結果:(""
) */
date date2;
[value3 getvalue:&date2];//取出對應的結構體,注意沒有返回值
//[value3 objctype]//取出包裝內容的型別 nslog(@"%i,%i,%i",date2.year,date2.month,date2.day); //結果:2014,2,28
}int main(int argc, const char *ar**)
return 0;
}
裝箱和拆箱,自動裝箱和自動拆箱
以integer的建立為例。裝箱 把基本資料型別轉換成包裝類物件 int integer integer num1 new integer 17 拆箱 把乙個包裝類的物件,轉換成基本型別的變數 integer int int num2 num1.intvalue 自動裝箱 integer num3 ...
裝箱和拆箱
在c 中的有兩種型別的變數 值型別和引用型別。當值型別和引用型別相互轉化時,會發生裝箱和拆箱的過程。這裡有一點要宣告 經過拆箱或裝箱的物件會多出它自己乙份拷貝,如圖所示 從圖可以看出它和它的拷貝不在乙個儲存區域。這也是值型別和引用型別的區別所在。值型別總是在棧中,而引用型別總是在託管堆中。目前j2s...
裝箱和拆箱
裝箱 boxing 和拆箱 unboxing 是c 型別系統中重要的概念。它通過允許任何數值型別的資料被轉換為任何形式型別的物件提供了數值型別和引用型別間的緊密聯絡。裝箱和拆箱使得對在其中任何型別都可以最終被看作物件的型別系統的統一的觀察變為可能。裝箱轉換允許任何數值型別可以隱式地轉換為 objec...