NSValueクラス
解説
| 継承 | 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"));
}