{"id":13437,"date":"2015-01-19T17:50:50","date_gmt":"2015-01-19T08:50:50","guid":{"rendered":"http:\/\/labs.gree.jp\/blog\/?p=13437"},"modified":"2015-01-19T17:50:50","modified_gmt":"2015-01-19T08:50:50","slug":"64bit%e7%92%b0%e5%a2%83%e3%81%ab%e3%81%8a%e3%81%91%e3%82%8bobjective-c%e3%81%ae%e3%83%9d%e3%82%a4%e3%83%b3%e3%82%bf","status":"publish","type":"post","link":"https:\/\/labs.gree.jp\/blog\/2015\/01\/13437\/","title":{"rendered":"64bit\u74b0\u5883\u306b\u304a\u3051\u308bObjective-C\u306e\u30dd\u30a4\u30f3\u30bf"},"content":{"rendered":"<h1>\u306f\u3058\u3081\u306b<\/h1>\n<p>\u3053\u3093\u306b\u3061\u306f\u3001GREE Platform\u90e8\u306e\u67f3\u6751(<a href=\"https:\/\/twitter.com\/yana_3\">@yana_3<\/a>)\u3067\u3059\u3002<\/p>\n<p>iOS\u30a8\u30f3\u30b8\u30cb\u30a2\u306e\u307f\u306a\u3055\u307e\u306b\u304a\u304b\u308c\u307e\u3057\u3066\u306fXcode6\u4ee5\u964d\u306e\u4f7f\u7528\u306864bit\u5bfe\u5fdc\u304c\u5fc5\u9808\u306b\u306a\u308a\u307e\u3059\u304c\u3001\u5bfe\u5fdc\u3059\u3059\u3093\u3067\u3044\u307e\u3059\u304b\uff1f<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.apple.com\/news\/?id=10202014a\">64-bit and iOS 8 Requirements for New Apps<\/a><\/li>\n<li><a href=\"https:\/\/developer.apple.com\/news\/?id=12172014b\">64-bit and iOS 8 Requirements for App Updates<\/a><\/li>\n<\/ul>\n<p>GREE Platform\u3067\u306f\u300164bit\u5bfe\u5fdc\u306e\u691c\u8a3c\u3092\u3059\u308b\u4e2d\u3067\u30dd\u30a4\u30f3\u30bf\u5468\u308a\u3067JSONKit<sup id=\"fnref-13437-\u203b\"><a href=\"#fn-13437-\u203b\" rel=\"footnote\">1<\/a><\/sup>\u304c\u30af\u30e9\u30c3\u30b7\u30e5\u3059\u308b\u3068\u3044\u3046\u4e8b\u614b\u304c\u767a\u751f\u3057\u3001\u305d\u3053\u304b\u308964bit\u6642\u306e\u30dd\u30a4\u30f3\u30bf\u306b\u3064\u3044\u3066\u8abf\u3079\u305f\u306e\u3067\u3059\u304c\u3001<br \/>\n\u3042\u307e\u308a\u3053\u306e\u5185\u5bb9\u306b\u95a2\u3057\u3066\u8a73\u3057\u304f\u8a18\u8f09\u3055\u308c\u3066\u3044\u308b\u3068\u3053\u308d\u304c\u306a\u304b\u3063\u305f\u3088\u3046\u306a\u306e\u3067\u5171\u6709\u3057\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<p>\u305f\u3060\u666e\u901a\u306biOS\u3067\u958b\u767a\u3059\u308b\u3076\u3093\u306b\u306f\u5168\u304f\u5f79\u306b\u7acb\u305f\u306a\u3044\u5185\u5bb9\u306b\u306a\u3063\u3066\u304a\u308a\u307e\u3059\u306e\u3067\u3042\u3089\u304b\u3058\u3081\u3054\u4e86\u627f\u304f\u3060\u3055\u3044mm<\/p>\n<h2>\u8abf\u3079\u308b\u304d\u3063\u304b\u3051<\/h2>\n<p>64bit\u74b0\u5883\u3067\u306e\u307fJSONKit\u3067<br \/>\n<b>0xb000000000000012<\/b><br \/>\n\u3068\u3044\u3046\u660e\u3089\u304b\u306b\u30e1\u30e2\u30ea\u5916\u3063\u307d\u3044\u30a2\u30c9\u30ec\u30b9\u3092\u305f\u305f\u3044\u3066EXC_BAD_ACCESS\u3067\u30af\u30e9\u30c3\u30b7\u30e5\u3059\u308b\u3068\u3044\u3046\u554f\u984c\u304c64bit\u5bfe\u5fdc\u306e\u691c\u8a3c\u4e2d\u306b\u767a\u751f\u3057\u307e\u3057\u305f\u3002<\/p>\n<p>\u3053\u306e\u30a2\u30c9\u30ec\u30b9\u306e\u6b63\u4f53\u3092\u7a81\u304d\u6b62\u3081\u308b\u3068 <b>@1<\/b> \u3064\u307e\u308a <b>[NSNumber numberWithInt:1]<\/b> \u3067\u3057\u305f\u3002<br \/>\n\u3053\u308c\u304c\u306a\u305c\u3053\u3093\u306a\u30a2\u30c9\u30ec\u30b9\u306b\u306a\u3063\u3066\u3044\u308b\u306e\u304b\u8abf\u3079\u308b\u3068\u3001<b>Objective-C\u3067\u306f64bit\u74b0\u5883\u306b\u304a\u3044\u3066\u306fTagged Pointer(\u30bf\u30b0\u4ed8\u304d\u30dd\u30a4\u30f3\u30bf)\u304c\u4f7f\u308f\u308c\u3066\u3044\u308b\u306e\u3067\u306f<\/b>\u3068\u3044\u3046\u3068\u3053\u308d\u306b\u884c\u304d\u7740\u304d\u307e\u3057\u305f\u3002<\/p>\n<p>\u3053\u306eTagged Pointer\u304cObjective-C\u3067\u3069\u306e\u3088\u3046\u306b\u5b9f\u969b\u4f7f\u308f\u308c\u3066\u3044\u308b\u306e\u304b\u8abf\u67fb\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<h2>Tagged Pointer<\/h2>\n<p>Tagged Pointer\u3068\u306f\u3001\u3056\u3063\u304f\u308a\u8aac\u660e\u3059\u308b\u3068\u3001\u4eee\u60f3\u30e1\u30e2\u30ea\u306e\u30a2\u30c9\u30ec\u30b9\u7a7a\u9593\u3092\u8868\u73fe\u3059\u308b\u306e\u306b64bit\u30d5\u30eb\u3067\u5fc5\u8981\u3067\u306f\u306a\u3044\u306e\u3067\u3001\u30dd\u30a4\u30f3\u30bf\u306e\u4f59\u3063\u305fbit\u306b\u578b\u60c5\u5831\u306a\u3069\u4ed8\u52a0\u7684\u306a\u60c5\u5831\u3092\u542b\u3081\u308b\u3053\u3068\u3067\u6709\u52b9\u6d3b\u7528\u3059\u308b\u3068\u3044\u3046\u6280\u8853\u3067\u3059\u3002<\/p>\n<p>\u53c2\u8003\u306b<a href=\"http:\/\/www.arm.com\/ja\/products\/processors\/armv8-architecture.php\">ARM v8\u306e\u8cc7\u6599<\/a>\u306e\u4e2d\u306b\u3042\u308bARMv8 Architecture Technical Preview\u3092\u898b\u308b\u3068\u3001<br \/>\n\u30a2\u30c9\u30ec\u30b9\u7a7a\u9593\u306f\u6700\u592748bit\u3067\u3001\u4e0a\u4f4d8bit\u306fTagged Pointer\u3068\u3057\u3066\u8a2d\u5b9a\u3067\u304d\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u5074\u3067\u5224\u5225\u3059\u308b\u3068\u66f8\u3044\u3066\u3042\u308a\u307e\u3059\u3002<\/p>\n<blockquote><p>\n  \u30fbSupporting up to 48 bits of VA space for each TTBR<br \/>\n  \u30fbUpper 8 bits of address can be configured for Tagged Pointers<br \/>\n  \u3000- Meaning interpreted by software\n<\/p><\/blockquote>\n<p>\u5b9f\u969biOS\u3067\u3069\u3046\u306a\u3063\u3066\u308b\u306e\u304b\u898b\u3066\u3044\u304d\u307e\u3059<\/p>\n<h3>Tagged Pointer\u306e\u691c\u8a3c<\/h3>\n<blockquote><p>\n  \u691c\u8a3c\u74b0\u5883\uff1aXcode 6.1\u3001iPhone6\n<\/p><\/blockquote>\n<p>Apple\u306e\u30bd\u30fc\u30b9\u3092\u8abf\u3079\u305f\u3089<a href=\"http:\/\/www.opensource.apple.com\/source\/objc4\/objc4-646\/runtime\/objc-internal.h\">objc-internal.h<\/a>\u306b\u305d\u308c\u3063\u307d\u3044\u3082\u306e\u304c\u3042\u3063\u305f\u306e\u3067\u3053\u308c\u3092\u983c\u308a\u306b\u691c\u8a3c\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<p>\u3053\u3053\u3092\u898b\u305f\u3068\u3053\u308d\u3001<b>NSString,NSNumber,NSIndexPath,NSManagedObjectID,NSDate<\/b>\u304cTagged Pointer\u306b\u5bfe\u5fdc\u3057\u3066\u305d\u3046\u3067\u3059\u3002<\/p>\n<pre><code>{\n    OBJC_TAG_NSAtom            = 0, \n    OBJC_TAG_1                 = 1, \n    OBJC_TAG_NSString          = 2, \n    OBJC_TAG_NSNumber          = 3, \n    OBJC_TAG_NSIndexPath       = 4, \n    OBJC_TAG_NSManagedObjectID = 5, \n    OBJC_TAG_NSDate            = 6, \n    OBJC_TAG_7                 = 7\n};\n<\/code><\/pre>\n<p>\u307e\u305f\u30b3\u30e1\u30f3\u30c8\u306760bit\u304c\u30da\u30a4\u30ed\u30fc\u30c9\u3067\u30013bit\u304ctag index\u30011bit\u304ctagged pointer\u306e\u30d5\u30e9\u30b0\u3060\u3068\u66f8\u3044\u3066\u3042\u308a\u307e\u3059(ARMv8\u306b\u66f8\u3044\u3066\u3042\u308b\u306e\u3068\u306f\u3061\u3087\u3063\u3068\u9055\u3044\u307e\u3059\u306d<\/p>\n<pre><code>\/\/ Tagged pointer layout and usage is subject to change \n\/\/ on different OS versions. The current layout is:\n\/\/ (MSB)\n\/\/ 60 bits  payload\n\/\/  3 bits  tag index\n\/\/  1 bit   1 for tagged pointer objects, 0 for ordinary objects\n\/\/ (LSB)\n<\/code><\/pre>\n<p>\u5b9f\u88c5\u3092\u307f\u3066\u307f\u308b\u3068\u3053\u306e\u30b3\u30e1\u30f3\u30c8\u306e\u901a\u308a\u306b\u306a\u3063\u3066\u308b\u3088\u3046\u3067\u3059\u3002<\/p>\n<div>\n<pre>\n\/\/ tagged pointer marker is MSB\nstatic inline void *\n_objc_makeTaggedPointer(objc_tag_index_t tag, uintptr_t value)\n{\n    \/\/ assert(_objc_taggedPointersEnabled());\n    \/\/ assert((unsigned int)tag < 8);\n    \/\/ assert(((value << 4) >> 4) == value);\n    return (void*)((1UL &lt< 63) | ((uintptr_t)tag << 60) | (value & ~(0xFUL << 60)));\n}\nstatic inline bool \n_objc_isTaggedPointer(const void *ptr) \n{\n    return (intptr_t)ptr < 0;  \/\/ a.k.a. ptr & 0x8000000000000000\n}\nstatic inline objc_tag_index_t \n_objc_getTaggedPointerTag(const void *ptr) \n{\n    \/\/ assert(_objc_isTaggedPointer(ptr));\n    return (objc_tag_index_t)(((uintptr_t)ptr >> 60) & 0x7);\n}\nstatic inline uintptr_t\n_objc_getTaggedPointerValue(const void *ptr) \n{\n    \/\/ assert(_objc_isTaggedPointer(ptr));\n    return (uintptr_t)ptr & 0x0fffffffffffffff;\n}\nstatic inline intptr_t\n_objc_getTaggedPointerSignedValue(const void *ptr) \n{\n    \/\/ assert(_objc_isTaggedPointer(ptr));\n    return ((intptr_t)ptr << 4) >> 4;\n}\n<\/pre>\n<\/div>\n<p>\u6b21\u306b\u3001\u30c7\u30d0\u30c3\u30ac\u3092\u4f7f\u3063\u3066\u5b9f\u969b\u306bNSNumber\u3067\u30dd\u30a4\u30f3\u30bf\u3092\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<pre><code>(lldb) expr NSNumber* $num1 = @1\n(lldb) p $num1\n(NSNumber *) $num1 = 0xb000000000000012 (int)1\n(lldb) expr NSNumber* $num16 = @16\n(lldb) p $num16\n(NSNumber *) $num16 = 0xb000000000000102 (int)16\n<\/code><\/pre>\n<p>@1\u3068@16\u306e\u5834\u5408\u306e\u9055\u3044\u3092\u898b\u3066\u307f\u308b\u3068\u3001<br \/>\n@1\u306e\u5834\u5408\u306f  <b>0xb0...0012<\/b>  \u306b\u306a\u3063\u3066\u3044\u308b\u306e\u306b\u5bfe\u3057\u3001<br \/>\n@16\u306e\u5834\u5408\u306f  <b>0xb0..0102<\/b>  \u3068\u306a\u3063\u3066\u3044\u308b\u3053\u3068\u304b\u3089\u3001<br \/>\n5bit\u76ee\u301c60bit\u76ee\u304f\u3089\u3044\u307e\u3067\u304c\u6570\u5024\u3092\u8868\u3057\u3066\u3044\u308b\u3088\u3046\u306b\u8003\u3048\u3089\u308c\u307e\u3059\u3002<\/p>\n<p>\u307e\u305f\u3001\u5148\u982d\u306e  <b>0xb..<\/b>  \u306e\u90e8\u5206\u306b\u3064\u3044\u3066\u3067\u3059\u304c\u3001<br \/>\nobjc-internal.h\u306b\u623b\u3063\u3066\u307f\u308b\u3068\u300164bit\u76ee\u304c 1, 61~63bit\u76ee\u304ctag\u3068\u306a\u3063\u3066\u3044\u307e\u3059\u3002<br \/>\nNSNumber\u3060\u3068tag\u306e\u5024\u306f <b>3<\/b> \u306a\u306e\u3067\u3001\u30dd\u30a4\u30f3\u30bf\u306f <b>0xb<\/b> \u304b\u3089\u59cb\u307e\u308b\u3053\u3068\u306b\u306a\u308a\u3001\u30bd\u30fc\u30b9\u306b\u66f8\u3044\u3066\u3042\u308b\u3053\u3068\u3068\u5b9f\u969b\u306e\u30dd\u30a4\u30f3\u30bf\u306e\u30d3\u30c3\u30c8\u30a2\u30b5\u30a4\u30f3\u304c\u4e00\u81f4\u3057\u3066\u3044\u307e\u3059\u306d\u3002<\/p>\n<div>\n<pre>\n_objc_makeTaggedPointer(objc_tag_index_t tag, uintptr_t value)\n{\n    \/\/ assert(_objc_taggedPointersEnabled());\n    \/\/ assert((unsigned int)tag < 8);\n    \/\/ assert(((value << 4) >> 4) == value);\n    return (void*)((1UL << 63) | ((uintptr_t)tag << 60) | (value & ~(0xFUL << 60)));\n}\n<\/pre>\n<\/div>\n<p>\u3057\u304b\u3057\u30011~4bit\u76ee\u304c <b>2<\/b> \u306b\u306a\u3063\u3066\u308b\u306e\u306f\u306a\u3093\u306a\u306e\u304b\u8b0e\u304c\u6b8b\u308a\u307e\u3059\u3002NSNumber\u306a\u306e\u3067int\u3068\u304blong\u3068\u304b\u306e\u578b\u3067\u3057\u3087\u3046\u304b\u3002<\/p>\n<p>\u8abf\u3079\u3066\u307f\u308b\u3068<\/p>\n<pre><code>(lldb) expr NSNumber* $longNum = @(1UL)\n(lldb) p $longNum\n(NSNumber *) $longNum = 0xb000000000000013 (long)1\n<\/code><\/pre>\n<p>int\u3060\u3068 <b>2<\/b> \u3060\u3063\u305f\u306e\u304clong\u306b\u3059\u308b\u3068 <b>3<\/b> \u306b\u5909\u308f\u3063\u305f\u306e\u3067\u3084\u306f\u308a\u578b\u60c5\u5831\u306e\u3088\u3046\u3067\u3059\u3002\u6b8b\u5ff5\u306a\u304c\u3089\u5b9a\u7fa9\u307e\u3067\u306f\u898b\u3064\u3051\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002<\/p>\n<p>\u30dd\u30a4\u30f3\u30bf\u306ebit\u30a2\u30b5\u30a4\u30f3\u3092\u307e\u3068\u3081\u308b\u3068\u4ee5\u4e0b\u306e\u56f3\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<br \/>\n<a href=\"http:\/\/labs.gree.jp\/blog\/wp-content\/uploads\/2015\/01\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2015-01-07-\u5348\u5f8c1.07.01.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/labs.gree.jp\/blog\/wp-content\/uploads\/2015\/01\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2015-01-07-\u5348\u5f8c1.07.01-600x204.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2015-01-07 \u5348\u5f8c1.07.01\" width=\"600\" height=\"204\" class=\"alignnone size-medium wp-image-13473\" srcset=\"https:\/\/labs.gree.jp\/blog\/wp-content\/uploads\/2015\/01\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2015-01-07-\u5348\u5f8c1.07.01-600x204.png 600w, https:\/\/labs.gree.jp\/blog\/wp-content\/uploads\/2015\/01\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2015-01-07-\u5348\u5f8c1.07.01-276x94.png 276w, https:\/\/labs.gree.jp\/blog\/wp-content\/uploads\/2015\/01\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2015-01-07-\u5348\u5f8c1.07.01-830x282.png 830w, https:\/\/labs.gree.jp\/blog\/wp-content\/uploads\/2015\/01\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2015-01-07-\u5348\u5f8c1.07.01.png 1730w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><\/p>\n<p>NSDate\u3082\u8a66\u3057\u306b\u78ba\u8a8d\u3057\u3066\u307f\u305f\u3068\u3053\u308d\u3001Tagged Pointer\u306b\u306a\u3063\u3066\u3044\u308b\u3088\u3046\u3067\u3057\u305f\u3002<\/p>\n<pre><code>(lldb) expression NSDate* $date1=[NSDate dateWithTimeIntervalSinceReferenceDate:1]\n(lldb) p $date1\n(NSDate *) $date1 = 0xe3ff000000000000 2001-01-01 09:00:01 JST\n<\/code><\/pre>\n<p>\u3061\u306a\u307f\u306bretain\u3057\u305f\u3089\u3069\u3046\u306a\u308b\u306e\u304bMRC\u74b0\u5883\u3067\u8a66\u3057\u3066\u307f\u307e\u3057\u305f\u304c\u7279\u306b\u5909\u5316\u306f\u3042\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002<br \/>\n\u30bd\u30fc\u30b9(<a href=\"http:\/\/www.opensource.apple.com\/source\/objc4\/objc4-646\/runtime\/NSObject.mm\">NSObject.m<\/a>)\u3092\u898b\u3066\u307f\u308b\u3068\u78ba\u304b\u306bretain,release,autorelease\u3067\u306f\u4f55\u3082\u3057\u306a\u3044\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u307e\u3057\u305f\u3002<br \/>\n\uff03\u3053\u308c\u307e\u3067\u8abf\u3079\u305fObjective-C\u306eTagged Pointer\u306e\u4f7f\u308f\u308c\u65b9\u3060\u3068\u30d2\u30fc\u30d7\u306b\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u5b9f\u4f53\u81ea\u4f53\u4fdd\u5b58\u3059\u308b\u5fc5\u8981\u306a\u3044\uff08\u30e1\u30e2\u30ea\u7ba1\u7406\u3059\u308b\u5fc5\u8981\u306a\u3044\uff09\u306e\u3067\u5f53\u305f\u308a\u524d\u3068\u3044\u3048\u3070\u5f53\u305f\u308a\u524d\u3002<\/p>\n<div>\n<pre>\n__attribute__((aligned(16)))\nid \nobjc_retain(id obj)\n{\nif (!obj) return obj;\nif (obj->isTaggedPointer()) return obj;\nreturn obj->retain();\n}\n\n__attribute__((aligned(16)))\nvoid \nobjc_release(id obj)\n{\nif (!obj) return;\nif (obj->isTaggedPointer()) return;\nreturn obj->release();\n}\n\n__attribute__((aligned(16)))\nid\nobjc_autorelease(id obj)\n{\nif (!obj) return obj;\nif (obj->isTaggedPointer()) return obj;\nreturn obj->autorelease();\n}\n<\/pre>\n<\/div>\n<p>\u4ee5\u4e0a\u306e\u3053\u3068\u304b\u3089\u3001NSNumber,NSDate\u306a\u3069\u304cTagged Pointer\u306b\u5bfe\u5fdc\u3057\u3066\u3044\u3066\u300160bit\u304c\u30da\u30a4\u30ed\u30fc\u30c9\u3067\u30013bit\u304ctag index\u30011bit\u304ctagged pointer\u306e\u30d5\u30e9\u30b0\u3068\u3057\u3066\u4f7f\u308f\u308c\u3066\u3044\u308b\u3053\u3068\u304c\u308f\u304b\u308a\u307e\u3057\u305f\u3002<\/p>\n<p>\u3068\u3053\u308d\u3067\u300164bit\u5bfe\u5fdc\u306e\u30d0\u30a4\u30d6\u30eb\u3067\u3042\u308b<a href=\"https:\/\/developer.apple.com\/jp\/devcenter\/ios\/library\/documentation\/CocoaTouch64BitGuide.pdf\">64bit\u79fb\u884c\u30ac\u30a4\u30c9<\/a>\u3092\u8aad\u307f\u304b\u3048\u3057\u3066\u307f\u307e\u3059\u3068\u3001<\/p>\n<blockquote><p>\n  <b>\"\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306eisa\u30d5\u30a3\u30fc\u30eb\u30c9\u306b\u76f4\u63a5\u30a2\u30af\u30bb\u30b9\u3059\u308b\u30b3\u30fc\u30c9\u306f\u300164\u30d3\u30c3\u30c8\u30e9\u30f3\u30bf\u30a4\u30e0\u4e0a\u3067\u306f\u6b63\u5e38\u306b\u52d5\u4f5c\u3057\u307e\u305b\u3093\u3002isa\u30d5\u30a3\u30fc\u30eb\u30c9\u306b\u3001\u30dd\u30a4\u30f3\u30bf\u305d\u306e\u3082\u306e\u306f\u4fdd\u6301\u3057\u306a\u3044\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002\u4ee3\u308f\u308a\u306b\u3001\u30dd\u30a4\u30f3\u30bf\u306b\u7d50\u3073\u3064\u3044\u305f\u3042\u308b\u30c7\u30fc\u30bf\u3092\u53ce\u5bb9\u3057\u3001\u4f59\u3063\u305f\u30d3\u30c3\u30c8\u3067\u4ed6\u306e\u30e9\u30f3\u30bf\u30a4\u30e0\u60c5\u5831\u3092\u4fdd\u6301\u3059\u308b\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002\u3053\u306e\u6700\u9069\u5316\u306b\u3088\u308a\u3001\u30e1\u30e2\u30ea\u52b9\u7387\u3068\u51e6\u7406\u6027\u80fd\u304c\u5411\u4e0a\u3057\u3066\u3044\u307e\u3059\u3002\"<\/b>\n<\/p><\/blockquote>\n<p>\u3068\u66f8\u3044\u3066\u3042\u308a\u307e\u3059\u3002<\/p>\n<p>\u3057\u304b\u3057\u306a\u304c\u3089\u3001\u3053\u308c\u307e\u3067\u8abf\u3079\u305f\u611f\u3058\u3060\u3068\u300164bit\u306eTagged Pointer\u306b\u5bfe\u5fdc\u3057\u305f\u30af\u30e9\u30b9\u306e\u5834\u5408\u3001\u305d\u3082\u305d\u3082\u30dd\u30a4\u30f3\u30bf\u304c\u5b9f\u4f53\u306e\u30a2\u30c9\u30ec\u30b9\u3092\u793a\u3057\u3066\u3044\u306a\u3044\u306e\u3067\u3001obj->isa\u306e\u3088\u3046\u306bisa\u30d5\u30a3\u30fc\u30eb\u30c9\u306b\u30a2\u30af\u30bb\u30b9\u81ea\u4f53\u3067\u304d\u306a\u3044\u306e\u3067\u4e0a\u8a18\u306e\u3088\u3046\u306a\u5185\u5bb9\u3068\u306f\u7570\u306a\u308b\u3088\u3046\u306b\u601d\u3048\u307e\u3059\u3002\u3002<\/p>\n<p>\u3068\u306a\u308b\u3068\u3001Tagged Pointer\u306b\u5bfe\u5fdc\u3057\u3066\u3044\u306a\u3044\u30af\u30e9\u30b9\u306eisa\u30dd\u30a4\u30f3\u30bf\u3082\u4f55\u304b\u5909\u308f\u3063\u3066\u3044\u308b\u3068\u3044\u3046\u3053\u3068\u3067\u3057\u3087\u3046\u304b\u3002<\/p>\n<p>\u6b21\u306bTagged Pointer\u306b\u5bfe\u5fdc\u3057\u3066\u3044\u306a\u3044\u30af\u30e9\u30b9\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306eisa\u30dd\u30a4\u30f3\u30bf\u3092\u898b\u3066\u307f\u307e\u3059\u3002<\/p>\n<h2>isa\u30dd\u30a4\u30f3\u30bf<\/h2>\n<p>isa\u30dd\u30a4\u30f3\u30bf\u306f\u3001\u3056\u3063\u304f\u308a\u3044\u3046\u3068\u30af\u30e9\u30b9\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u6307\u3059\u30dd\u30a4\u30f3\u30bf\u3067\u3001Objective-C\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306fobjc_object\u69cb\u9020\u4f53\u3092\u30d9\u30fc\u30b9\u306b\u3057\u3066\u3044\u308b\u306e\u3067\u5168\u3066\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306f\u5148\u982d\u306bisa\u30dd\u30a4\u30f3\u30bf\u3092\u4fdd\u6301\u3057\u3066\u3044\u307e\u3059\u3002<br \/>\n\u8a73\u3057\u304f\u306f\u3053\u3053\u3067\u306f\u5272\u611b\u3057\u307e\u3059\u306e\u3067\u3001objc.h\u306e\u5b9f\u88c5\u3084\u305d\u306e\u4ed6\u89e3\u8aac\u30b5\u30a4\u30c8\u3084\u672c\u3092\u5fa1\u89a7\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>objc.h<\/p>\n<pre><code>\/\/\/ A pointer to an instance of a class.\ntypedef struct objc_object *id;\n\/\/\/ Represents an instance of a class.\nstruct objc_object {\nClass isa OBJC_ISA_AVAILABILITY;\n};\n\/\/\/ An opaque type that represents an Objective-C class.\ntypedef struct objc_class *Class;\n<\/code><\/pre>\n<h3>isa\u30dd\u30a4\u30f3\u30bf\u306e\u691c\u8a3c<\/h3>\n<p>\u307e\u305a\u306f\u3001NSString\u306e\u5b9f\u4f53\u3092\u898b\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<pre><code>(lldb) expr NSString* $str1 = @\"hoge\"\n(lldb) p *$str1\n(NSString) $0 = {\n  NSObject = {\n    isa = __NSCFString\n  }\n}\n<\/code><\/pre>\n<p>NSSting\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306eisa\u30dd\u30a4\u30f3\u30bf\u3068\u3001NSCFString\u30af\u30e9\u30b9\u306e\u30dd\u30a4\u30f3\u30bf\u3092\u6bd4\u3079\u3066\u307f\u307e\u3059\u3002<\/p>\n<div>\n<pre>\n(lldb) p\/x $str1->isa\n(Class) $1 = 0x00000001067f14b8 __NSCFString\n(lldb) p\/x [__NSCFString class]\n(Class) $2 = 0x00000001067f14b8 __NSCFString\n<\/pre>\n<\/div>\n<p>\u5168\u304f\u540c\u3058\u3067\u3059\u306d\u3002<\/p>\n<p>\u4e00\u3064\u3057\u304b\u8abf\u3079\u3066\u306a\u3044\u3067\u3059\u304c\u3001isa\u30dd\u30a4\u30f3\u30bf\u306b\u306f32bit\u306e\u6642\u3068\u6bd4\u3079\u3066\u7279\u306b\u5909\u308f\u308a\u306f\u306a\u3044\u3088\u3046\u3067\u3059\u3002<\/p>\n<h2>\u307e\u3068\u3081<\/h2>\n<ul>\n<li>64bit\u306e\u5834\u5408\u3001NSNumber,NSDate\u306a\u3069\u306e\u4e00\u90e8\u306eObjective-C\u306e\u30af\u30e9\u30b9\u3067\u306fTagged Pointer\u304c\u5229\u7528\u3055\u308c\u3066\u3044\u3066\u3001\u30dd\u30a4\u30f3\u30bf\u3092\u89e3\u91c8\u3059\u308b\u3060\u3051\u3067\u5024\u304c\u5224\u5225\u3067\u304d\u308b\u305f\u3081\u3001\u3053\u308c\u3089\u3092\u751f\u6210\u3059\u308b\u3076\u3093\u306b\u306f\u30e1\u30e2\u30ea(\u30d2\u30fc\u30d7)\u3092\u4f7f\u308f\u306a\u3044\u306e\u3067\u30e1\u30e2\u30ea\u306b\u3084\u3055\u3057\u3044\u3002<\/li>\n<li>Tagged Pointer\u304c\u5229\u7528\u3055\u308c\u3066\u3044\u308b\u5834\u5408\u306f\u30dd\u30a4\u30f3\u30bf\u304c\u5b9f\u4f53\u306e\u30a2\u30c9\u30ec\u30b9\u3092\u793a\u3057\u3066\u3044\u308b\u308f\u3051\u3067\u306f\u306a\u304f\u306a\u3063\u305f\u306e\u3067\u3001\u666e\u901a\u306e\u30dd\u30a4\u30f3\u30bf\u3068\u601d\u3063\u3066\u4f7f\u3063\u3066\u3057\u307e\u3046\u3068\u30af\u30e9\u30c3\u30b7\u30e5\u3059\u308b\u306e\u3067\u826f\u3044\u5b50\u306f\u4f7f\u308f\u306a\u3044\u3088\u3046\u306b\u3057\u307e\u3057\u3087\u3046\u3002<\/li>\n<li>Tagged Pointer\u4ee5\u5916\u306e\u5834\u5408\u306fisa\u30dd\u30a4\u30f3\u30bf\u306f\u7279\u306b\u5909\u308f\u3063\u3066\u306a\u3044\uff08\u305f\u3076\u3093\uff09<\/li>\n<\/ul>\n<p>\u305f\u3060\u3057\u3001\u3053\u308c\u3089\u306f\u4eca\u5f8c\u5909\u308f\u3063\u3066\u3044\u304f\u3068\u601d\u3044\u307e\u3059\u306e\u3067\u3001\u3053\u308c\u3089\u306e\u5b9f\u88c5\u306b\u4f9d\u5b58\u3057\u305f\u3088\u3046\u306a\u5b9f\u88c5\u306f\u907f\u3051\u305f\u307b\u3046\u304c\u3088\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<div class=\"footnotes\">\n<hr \/>\n<ol>\n<li id=\"fn-13437-\u203b\">\n\u306a\u305c\u3044\u307e\u3069\u304dJSONKit\u4f7f\u3063\u3066\u308b\u306e\uff1f\u3068\u304a\u601d\u3044\u304b\u3068\u601d\u3044\u307e\u3059\u304c\u3001GreePlatformSDK\u3067\u306fiOS4.3\u3082\u30b5\u30dd\u30fc\u30c8\u3059\u308b\u3068\u3044\u3046\u4e8b\u60c5\u3067\u4f7f\u3063\u3066\u3044\u307e\u3057\u305f\u304c\u3001\u4eca\u56de\u306e64bit\u5bfe\u5fdc\u3067IOS5.1.1\u4ee5\u4e0a\u304c\u5fc5\u9808\u3068\u306a\u3063\u305f\u306e\u3092\u671f\u306b\u5229\u7528\u3092\u3084\u3081\u308b\u4e88\u5b9a\u3067\u3059\u3002&#160;<a href=\"#fnref-13437-\u203b\" rev=\"footnote\">&#8617;<\/a>\n<\/li>\n<\/ol>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u306f\u3058\u3081\u306b \u3053\u3093\u306b\u3061\u306f\u3001GREE Platform\u90e8\u306e\u67f3\u6751(@yana_3)\u3067\u3059\u3002 iOS\u30a8\u30f3\u30b8\u30cb\u30a2\u306e\u307f\u306a\u3055\u307e\u306b\u304a\u304b\u308c\u307e\u3057\u3066\u306fXcode6\u4ee5\u964d\u306e\u4f7f\u7528\u306864bit\u5bfe\u5fdc\u304c\u5fc5\u9808\u306b\u306a\u308a\u307e\u3059\u304c\u3001\u5bfe\u5fdc\u3059\u3059\u3093\u3067\u3044\u307e\u3059\u304b\uff1f 64-bit  [&hellip;]<\/p>\n","protected":false},"author":115,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[],"tags":[39],"class_list":["post-13437","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-ios"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/posts\/13437","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/users\/115"}],"replies":[{"embeddable":true,"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/comments?post=13437"}],"version-history":[{"count":3,"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/posts\/13437\/revisions"}],"predecessor-version":[{"id":13487,"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/posts\/13437\/revisions\/13487"}],"wp:attachment":[{"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/media?parent=13437"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/categories?post=13437"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/tags?post=13437"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}