原 IOS之NSValue整理
生活随笔
收集整理的這篇文章主要介紹了
原 IOS之NSValue整理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原 IOS之NSValue整理
發表于2年前(2013-02-28 23:02)?? 閱讀(1974)?|?評論(0)?5人收藏此文章,?我要收藏 贊3IOS?NSValue
?
值對象(value object)概念????????在面向對象的編程語言中,值對象本質上是數據元素的的對象包裝器,所謂數據元素,常見的包含string,number,date類型以及其它自定義的結構體類型。Objective-C語言本身提供了string,number,date相對應的包裝類,分別是NSString,NSNumber,NSDate,這些類創建的對象都可以稱為值對象。但值對象本身的范圍更加廣泛,它可以是任何自定義類型創建的對象。?
值對象作用?
????????C語言提供了char/int/float/double基本數據類型,基于C語言的Objective-C因此同樣包含了這幾種基本數據類型,我們可以定義并使用這些基本數據類型的變量,也可以使用其對應的值對象,對于自定義數據類型,我們也可以將由這些類型定義的變量通過NSValue來包裝成對象類型。相對于普通的變量,值對象提供了更多的功能和作用。?
????????1.可將任何值對象存儲在集合中。?
????????????在Objective-C中,諸如NSArray,NSDictionary這樣的集合類所包含的元素必須是對象類型。因此基本數據類型的變量必須轉換為值對象才能存儲在集合中。?
????????2.更加更加豐富的數據處理方法。?
????????????NSString或NSMulableString可以進行一系列針對字符串的操作,如字符串的連接,分割,查找,比較,提取字符等等。?
????????????NSDate和NSCaleder可進行復雜的日期處理和計算,所有這些計算都考慮了時區和閏年的影響。?
????????????NSNumber和NSDecimalNumber可以處理 char, short int, int, long int, long long int, float, or double , BOOL值,并提供了數值與字符串的轉換?
NSValue釋義?
????????上面我們已經提到NSValue可包裝基本數據類型為對象類型,下面我們來看下Apple官方文檔釋義:?
????????NSValue提供了簡單的容器來包含C或Objective-C數據項。可以容納任何基本數據類型如char,int,float,double,以及指針,結構體和對象ids。NSArray和NSSet集合類對象要求它們的元素為對象類型,NSValue的主要目的是使這些數據類型可以添加至集合中。NSValue對象是不可變類型。?
????????簡而言之,NSValue是基本數據類型或自定義數據類型所定義變量的對象包裝器。?
使用NSValue?
????????1.處理NSRange,方法?
?
| 1 2 | + (NSValue *)valueWithRange:(NSRange)range - (NSRange)rangeValue |
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | NSRange rangeA ; ? rangeA.location = 0 ; ? rangeA.location = 10 ; ? // 創建NSRange的值對象 NSValue *rangeValue = [NSValue valueWithRange:rangeA] ; ? // 重新獲取值對象包含的值 NSRange rangeB = [rangeValue rangeValue] ; ? NSLog(@"%d,%d",rangeB.location , rangeB.length) ; // 10,10 |
????????2.處理自定義結構體類型,方法?
?
| 1 2 3 | + (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type - (id)initWithBytes:(const void *)value objCType:(const char *)type - (void)getValue:(void *)buffer |
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // 結構體定義 typedef struct{ ???int a ; ???float b ;??? }DataItem ; ? DataItem dataElemA? ; ????? dataElemA.a = 10 ; ????? dataElemA.b = 10.005 ; ????? NSValue *value = [NSValue valueWithBytes:&dataItem objCType:@encode(DataItem)] ; ????? DataItem dataElemB ; ????? [value getValue:&dataElemB] ; ????? NSLog(@"%d,%0.3f",dataElemB.a,dataElemB.b); // 10,10.005 |
? ??
? ????? 原意想要保存myCString到NSValue中,但實際上myCString是以char的指針類型進行解析的,所以字符串的前四個字節被當做了指針的值,而不是地址值來對待。?
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | /* INCORRECT! */ ? char *myCString = "This is a string."; ? NSValue *theValue = [NSValue valueWithBytes:myCString objCType:@encode(char *)]; ? char *cc = (char*)malloc(sizeof(char*)*200) ; ???? [theValue getValue:cc]; ??? prinf("%s" , cc)? ; // This ???? free(cc) |
?
| 1 2 3 | char *myCString = "This is a string."; ???? NSString myNsString = [NSString stringWithCString:myCString encoding:NSUTF8StringEncoding] ; |
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | char *myCString = "This is a string."; ???? NSValue *theValue = [NSValue valueWithBytes:&myCString objCType:@encode(char **)]; ????? ?char **cc = (char**)malloc(sizeof(char**)*200) ; ???? [theValue getValue:cc]; ????? printf("----%s----" , *cc); // This is a string. ???? free(cc) ; ? cc = NULL ; |
?
| 1 2 | + (NSValue *)valueWithPointer:(const void *)aPointer - (void *)pointerValue |
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | DataItem *dd = (DataItem*)malloc(sizeof(DataItem)) ; ? dd->a = 1 ; ? dd->b = 2 ; ????? NSValue *pValue = [NSValue valueWithPointer:dd] ; ????? DataItem *dc = (DataItem*)[pValue pointerValue] ; ????? NSLog(@"%d,%0.3f",dc->a,dc->b); ????? free(dd) ; ????? dd = NULL ; ????? dc = NULL ; |
NSValue的分類?
UIKit Additions?
????????提供了Function框架中關于幾何數據類型結構體的對象值包裝,包括CGPoint,CGRect,CGSize,CGAffineTransform,UIEdgeInsets,UIOffset。?
????????以CGPoint為例(其它的結構體都有相對應的方法),方法???????????? ?? ?
| 1 2 | + (NSValue *)valueWithCGPoint:(CGPoint)point - (CGPoint)CGPointValue |
?
| 1 2 3 4 5 6 7 8 9 | CGPoint origin = CGPointMake(10.0 , 10.0) ; ????????? NSValue *ptValue = [NSValue valueWithCGPoint:origin] ; ????????? NSArray *ptArr = [NSArray arrayWithObject:ptValue]; ????????? NSValue *ptValueB = [ptArr objectAtIndex:0] ; ????????? CGPoint originB = [ptValueB CGPointValue] ; ? |
轉載于:https://www.cnblogs.com/iOS-mt/p/4106624.html
總結
以上是生活随笔為你收集整理的原 IOS之NSValue整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bootice添加黑苹果引导_懒人黑苹果
- 下一篇: Qimage像素级操作