解説
継承 | NSObject |
準拠 | NSObject (NSObject) |
フレームワーク | /System/Library/Frameworks/Foundation.framework |
使用可能 | Mac OS X 10.0以降 |
iOS 2.0以降 |
定義 | NSGeometry.h |
NSRange.h | |
NSValue.h |
定義 | NSRange.h |
NSValue.h |
概要
NSPoint、NSRange、構造体などをオブジェクトとして扱うためのクラスです。intやfloatなどはNSValueのサブクラスであるNSNumberで扱います。
NSArrayやNSSet、NSDictionaryで扱う要素はオブジェクトである必要があり、数値や構造体などはオブジェクトではないのでNSValueやNSNumberでカプセル化してからNSArrayやNSSet、NSDictionaryの要素とするのです。
NSValueオブジェクトは常に変更不可です。
NSValueオブジェクトの作成
NSRangeからNSValueを作成するには(+ valueWithRange:)メソッドを使用します。
NSRangeから作成
#pragma mark NSValue valueWithRange -(void)method003 { NSMutableDictionary *aDictionary = [NSMutableDictionary dictionaryWithCapacity:3]; [aDictionary setValue:@"ddd" forKey:@"stringKey"]; NSRange aRange = NSMakeRange(0, 10); [aDictionary setObject:[NSValue valueWithRange:aRange] forKey:@"rangeKey"]; NSLog(@"%s %p %@",__FUNCTION__,aDictionary,[aDictionary valueForKey:@"@allValues"]); //=>-[OOOAppDelegate method003] 0x6a2ac10 (ddd,"NSRange: {0, 10}") }
Objective-Cタイプと値からNSValueオブジェクトを作成するには(+ value:withObjCType:)メソッドを使用します。
CGPointからNSValueオブジェクトを作成
#pragma mark NSValue @encode(CGPoint) -(void)method004 { NSMutableDictionary *aDictionary = [NSMutableDictionary dictionaryWithCapacity:10]; [aDictionary setValue:@"ddd" forKey:@"stringKey"]; CGPoint aPoint = CGPointMake(0, 200); [aDictionary setObject:[NSValue value:&aPoint withObjCType:@encode(CGPoint)] forKey:@"objcKey"]; NSLog(@"%s %p %@",__FUNCTION__,aDictionary,[aDictionary valueForKey:@"@allValues"]); //=>-[OOOAppDelegate method001] 0x6a2ac10 (ddd,"NSPoint: {0, 200}") }
CポインタからNSValueを作成するには(+ valueWithBytes:objCType:)メソッドを使用します。allocで作成した後CポインタからNSValueを初期化するには(– initWithBytes:objCType:)メソッドを使用します。
#pragma mark NSValue objCType -(void)method007 { NSMutableDictionary *aDictionary = [NSMutableDictionary dictionaryWithCapacity:10]; char *cString = "My name is OOMORI."; NSValue *aValue = [NSValue valueWithBytes:cString objCType:@encode(char *) ]; [aDictionary setObject:aValue forKey:@"objcKey"]; NSLog(@"%s %s",__FUNCTION__,[aValue objCType]); NSLog(@"%s %@",__FUNCTION__,[aDictionary description]); //=>-[OOOAppDelegate method001] 0x6a2ac10 (ddd,"NSPoint: {0, 200}") NSLog(@"%s %p %@",__FUNCTION__,aDictionary,[aDictionary valueForKey:@"objcKey"]); }
オブジェクトからNSValueを作成するには(+ valueWithNonretainedObject:)メソッドを作成します。
ポインタ値からNSValueを作成するには(+ valueWithPointer:)メソッドを使います。
#pragma mark NSValue valueWithPointer -(void)method009 { NSMutableDictionary *aDictionary = [NSMutableDictionary dictionaryWithCapacity:10]; char *localString = "My name is OOMORI."; NSValue *theValue = [NSValue valueWithPointer: localString ]; [aDictionary setObject:theValue forKey:@"objcKey"]; char *theCString; theCString = [[aDictionary valueForKey:@"objcKey"] pointerValue]; NSLog(@"%s %s",__FUNCTION__,theCString); NSLog(@"%s %s",__FUNCTION__,[theValue objCType]); }
データへのアクセス
ポインタ値を取得するには(– pointerValue)メソッドを使用します。オブジェクトを取得するには(– nonretainedObjectValue)メソッドを使用します。NSRange値を取得するには(– rangeValue)メソッドを使用します。レシーバのObjective-Cタイプを取得するには(– objCType)メソッドを使用します。
レシーバの値を与えられたポインタ値にコピーするには(– getValue:)メソッドを使用します。
構造体をNSValueに
#pragma mark NSValue @encode(myStruct) typedef struct { NSUInteger point; NSUInteger length; } MYStruct; -(void)method002 { NSMutableDictionary *aDictionary = [NSMutableDictionary dictionaryWithCapacity:10]; [aDictionary setValue:@"ddd" forKey:@"key4"]; NSRange aRange = NSMakeRange(0, 10); [aDictionary setObject:[NSValue valueWithRange:aRange] forKey:@"keyNSRange"]; MYStruct myStruct; myStruct.point = 0; myStruct.length = 10; [aDictionary setObject:[NSValue value:&myStruct withObjCType:@encode(MYStruct)] forKey:@"keyMYStruct"]; NSLog(@"%s %p %@",__FUNCTION__,aDictionary,[aDictionary valueForKey:@"@allValues"]); NSValue *structValue = [aDictionary objectForKey:@"keyMYStruct"]; MYStruct myStruct2; [structValue getValue:&myStruct2]; NSLog(@"%s %p %d",__FUNCTION__,aDictionary,myStruct2.length); //=>10 }
オブジェクトの比較
レシーバと他のオブジェクトが同じかどうかを調べるには(– isEqualToValue:)メソッドを使います。
NSValueの比較
#pragma mark NSValue isEqualToValue -(void)method010 { CGPoint aPoint = CGPointMake(0, 200); NSValue *aValue = [NSValue value:&aPoint withObjCType:@encode(CGPoint)]; CGPoint bPoint = CGPointMake(0, 200); NSValue *bValue = [NSValue value:&bPoint withObjCType:@encode(CGPoint)]; CGPoint cPoint = CGPointMake(200, 200); NSValue *cValue = [NSValue value:&cPoint withObjCType:@encode(CGPoint)]; NSLog(@"a vs b %@",([aValue isEqualToValue:bValue]?@"YES":@"NO")); NSLog(@"a vs c %@",([aValue isEqualToValue:cValue]?@"YES":@"NO")); }