{"id":1382,"date":"2018-11-10T21:56:19","date_gmt":"2018-11-10T13:56:19","guid":{"rendered":"http:\/\/www.yusian.com\/blog\/?p=1382"},"modified":"2018-11-27T17:22:04","modified_gmt":"2018-11-27T09:22:04","slug":"objective-c%e4%b8%ad%e5%af%b9%e8%b1%a1%e7%9a%84%e5%88%86%e7%b1%bb%e4%b8%8e%e6%9c%ac%e8%b4%a8isasuperclass","status":"publish","type":"post","link":"https:\/\/www.yusian.com\/blog\/project\/2018\/11\/10\/2156191382.html","title":{"rendered":"Objective-C\u4e2d\u5bf9\u8c61\u7684\u5206\u7c7b\u4e0e\u672c\u8d28(isa&#038;superclass)"},"content":{"rendered":"<p>1\u3001OC\u4e2d\u5bf9\u8c61\u5206\u4e3a\u4e09\u79cd\uff1a\u5b9e\u4f8b\u5bf9\u8c61(instance)\u3001\u7c7b\u5bf9\u8c61(class)\u3001\u5143\u7c7b\u5bf9\u8c61(meta-class)\uff1b<br \/>\n2\u3001\u5b9e\u4f8b\u5bf9\u8c61\u7c7b\u578b\u4e3a\u521b\u5efa\u8be5\u5b9e\u4f8b\u7684\u7c7b\u7c7b\u578b\uff0c\u7c7b\u5bf9\u8c61\u4e0e\u5143\u7c7b\u5bf9\u8c61\u5747\u4e3aClass\u7c7b\u578b\uff1b<br \/>\n3\u3001\u6bcf\u521b\u5efa\u4e00\u4e2a\u5b9e\u4f8b\u90fd\u4f1a\u5728\u5185\u5b58\u4e2d\u65b0\u521b\u5efa\u4e00\u4e2a\u5b9e\u4f8b\u5bf9\u8c61\uff0c\u4f46\u7c7b\u5bf9\u8c61\u4e0e\u5143\u7c7b\u5bf9\u8c61\u53ea\u6709\u4e00\u4efd\uff1b<br \/>\n4\u3001\u7c7b\u7684\u6210\u5458\u53d8\u91cf\u503c\u4fdd\u5b58\u5728\u5b9e\u4f8b\u5bf9\u8c61\u4e2d\uff0c\u5bf9\u8c61\u65b9\u6cd5\u3001\u5c5e\u6027\u3001\u5c5e\u6027\u7c7b\u578b\u7b49\u4fe1\u606f\u4fdd\u5b58\u5728\u7c7b\u5bf9\u8c61\u4e2d\uff0c\u7c7b\u65b9\u6cd5\u4fdd\u5b58\u5728\u5143\u7c7b\u5bf9\u8c61\u4e2d\uff1b<br \/>\n5\u3001\u6240\u6709\u5bf9\u8c61\u90fd\u4f1a\u6709isa\u5c5e\u6027\u4e0esuperclass\u5c5e\u6027\uff1b<br \/>\n6\u3001isa\u6307\u9488\u7684\u6307\u5411\u4e3a\uff1aisntance->class->meta-class\uff1b<br \/>\n6.1\u3001\u5b9e\u4f8b\u5bf9\u8c61\u7684isa\u6307\u5411\u7c7b\u5bf9\u8c61\uff1b<br \/>\n6.2\u3001\u7c7b\u5bf9\u8c61\u7684isa\u6307\u5411\u5143\u7c7b\u5bf9\u8c61\uff1b<br \/>\n6.3\u3001\u5143\u7c7b\u5bf9\u8c61\u7684isa\u6307\u5411\u57fa\u7c7b\u7684\u5143\u7c7b\u5bf9\u8c61\uff0c\u5373OC\u4e2d\u6240\u6709\u5143\u7c7b\u5bf9\u8c61\u7684isa\u90fd\u6307\u5411NSObject\u7684\u5143\u7c7b\u5bf9\u8c61\uff1b<br \/>\n7\u3001superclass\u6307\u5411\u4e3a\u6307\u5411\u76f8\u5bf9\u5e94\u7684\u7236\u7c7b<br \/>\n7.1\u3001\u5b9e\u4f8b\u5bf9\u8c61\u7684superclass\u6307\u5411\u7c7b\u5bf9\u8c61\u7684\u7236\u7c7b\uff1b<br \/>\n7.2\u3001\u7c7b\u5bf9\u8c61\u7684superclass\u6307\u5411\u7c7b\u5bf9\u8c61\u7684\u7236\u7c7b\uff0c\u4f46\u57fa\u7c7b\u7c7b\u5bf9\u8c61\u7684superclass\u6307\u5411\u4e3anil\uff1b<br \/>\n7.3\u3001\u5143\u7c7b\u5bf9\u8c61\u7684superclass\u6307\u5411\u5143\u7c7b\u5bf9\u8c61\u7684\u7236\u7c7b\uff0c\u4f46\u57fa\u7c7b\u5143\u7c7b\u5bf9\u8c61\u7684superclass\u6307\u5411\u57fa\u7c7b\u7684\u7c7b\u5bf9\u8c61\uff1b<br \/>\n8\u3001\u57fa\u672c\u63cf\u8ff0\u56fe\u793a\uff1a<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.yusian.com\/blog\/wp-content\/uploads\/2018\/11\/1915113-192158848b1ebe7d-286x300.png\" alt=\"\" width=\"572\" height=\"600\" class=\"alignnone size-medium wp-image-1383\" srcset=\"https:\/\/www.yusian.com\/blog\/wp-content\/uploads\/2018\/11\/1915113-192158848b1ebe7d-286x300.png 286w, https:\/\/www.yusian.com\/blog\/wp-content\/uploads\/2018\/11\/1915113-192158848b1ebe7d.png 449w\" sizes=\"auto, (max-width: 572px) 100vw, 572px\" \/><\/p>\n<p>9\u3001\u4ee3\u7801\u9a8c\u8bc1<br \/>\n9.1\u3001Objective-C<\/p>\n<pre lang=\"objc\" line=\"1\">\/\/\r\n\/\/  ViewController.m\r\n\/\/  lldb\r\n\/\/\r\n\/\/  Created by \u4f59\u897f\u5b89 on 2018\/11\/1.\r\n\/\/  Copyright \u00a9 2018 yusian. All rights reserved.\r\n\/\/\r\n\r\n#import \"ViewController.h\"\r\n#import <objc\/runtime.h>\r\n\r\n@interface SAPerson : NSObject\r\n@end\r\n@implementation SAPerson\r\n@end\r\n\r\n@interface SAStudent : SAPerson\r\n@end\r\n@implementation SAStudent\r\n@end\r\n\r\n@implementation ViewController\r\n\/\/ \u4e3a\u4e86\u80fd\u591f\u4f7fClass\u6307\u9488\u80fd\u591f\u6b63\u5e38\u6253\u5370\u5176isa\u4e0esuperclass\u503c\uff0c\u81ea\u5b9a\u4e49\u4e00\u4e2a\u7ed3\u6784\u4f53\u7528\u4e8e\u5f3a\u8f6c\u8f93\u51fa\r\nstruct sa_object_class{\r\n    Class isa;\r\n    Class superclass;\r\n};\r\n- (void)viewDidLoad\r\n{\r\n    [super viewDidLoad];\r\n    SAStudent *studentInstance = SAStudent.new;\r\n    SAPerson *personInstance = SAPerson.new;\r\n    NSObject *objectInstance = NSObject.new;\r\n    NSLog(@\"\\nstudentInstance:%p \\n,personInstance:%p \\n,objectInstance:%p\", studentInstance, personInstance, objectInstance);\r\n    \r\n    struct sa_object_class *studentClass = (__bridge struct sa_object_class *)SAStudent.class;\r\n    struct sa_object_class *personClass = (__bridge struct sa_object_class *)SAPerson.class;\r\n    struct sa_object_class *objectClass = (__bridge struct sa_object_class *)NSObject.class;\r\n    NSLog(@\"\\nstudentClass:%p \\n,personClass:%p \\n,objectClass:%p\", studentClass, personClass, objectClass);\r\n    \r\n    struct sa_object_class *studentMetaClass = (__bridge struct sa_object_class *)object_getClass(SAStudent.class);\r\n    struct sa_object_class *personMetaClass = (__bridge struct sa_object_class *)object_getClass(SAPerson.class);\r\n    struct sa_object_class *objectMetaClass = (__bridge struct sa_object_class *)object_getClass(NSObject.class);\r\n    NSLog(@\"\\nstudentMetaClass:%p \\n,personMetaClass:%p \\n,objectMetaClass:%p\", studentMetaClass, personMetaClass, objectMetaClass);\r\n}\r\n@end<\/pre>\n<p>9.2\u3001LLDB\u8c03\u8bd5\u9a8c\u8bc1<\/p>\n<pre lang=\"lldb\" line=\"1\">2018-11-10 21:30:36.278006+0800 lldb[2848:269881] \r\nstudentInstance:0x6000018b8be0 \r\n,personInstance:0x6000018b8940 \r\n,objectInstance:0x6000018b8920\r\n\r\n2018-11-10 21:30:36.278164+0800 lldb[2848:269881] \r\nstudentClass:0x102481f58 \r\n,personClass:0x102481f08 \r\n,objectClass:0x10351df38\r\n\r\n2018-11-10 21:30:36.278268+0800 lldb[2848:269881] \r\nstudentMetaClass:0x102481f30 \r\n,personMetaClass:0x102481ee0 \r\n,objectMetaClass:0x10351dee8\r\n\r\n\r\n(lldb) p\/x studentInstance->isa\r\n(Class) $0 = 0x0000000102481f58 SAStudent\r\n(lldb) p\/x personInstance->isa\r\n(Class) $1 = 0x0000000102481f08 SAPerson\r\n(lldb) p\/x objectInstance->isa\r\n(Class) $2 = 0x000000010351df38 NSObject\r\n\r\n(lldb) p\/x studentClass->isa\r\n(Class) $3 = 0x0000000102481f30\r\n(lldb) p\/x personClass->isa\r\n(Class) $4 = 0x0000000102481ee0\r\n(lldb) p\/x objectClass->isa\r\n(Class) $5 = 0x000000010351dee8\r\n\r\n(lldb) p\/x studentMetaClass->isa\r\n(Class) $6 = 0x000000010351dee8\r\n(lldb) p\/x personMetaClass->isa\r\n(Class) $7 = 0x000000010351dee8\r\n(lldb) p\/x objectMetaClass->isa\r\n(Class) $8 = 0x000000010351dee8\r\n\r\n\r\n(lldb) p\/x studentInstance.superclass\r\n(Class) $9 = 0x0000000102481f08 SAPerson\r\n(lldb) p\/x personInstance.superclass\r\n(Class) $10 = 0x000000010351df38 NSObject\r\n(lldb) p\/x objectInstance.superclass\r\n(Class) $11 = nil\r\n\r\n(lldb) p\/x studentClass->superclass\r\n(Class) $12 = 0x0000000102481f08 SAPerson\r\n(lldb) p\/x personClass->superclass\r\n(Class) $13 = 0x000000010351df38 NSObject\r\n(lldb) p\/x objectClass->superclass\r\n(Class) $15 = nil\r\n\r\n(lldb) p\/x studentMetaClass->superclass\r\n(Class) $16 = 0x0000000102481ee0\r\n(lldb) p\/x personMetaClass->superclass\r\n(Class) $17 = 0x000000010351dee8\r\n(lldb) p\/x objectMetaClass->superclass\r\n(Class) $18 = 0x000000010351df38 NSObject<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>1\u3001OC\u4e2d\u5bf9\u8c61\u5206\u4e3a\u4e09\u79cd\uff1a\u5b9e\u4f8b\u5bf9\u8c61(instance)\u3001\u7c7b\u5bf9\u8c61(class)\u3001\u5143\u7c7b\u5bf9\u8c61(meta-class)\uff1b 2\u3001\u5b9e\u4f8b\u5bf9\u8c61\u7c7b\u578b\u4e3a\u521b\u5efa\u8be5\u5b9e\u4f8b\u7684\u7c7b\u7c7b\u578b\uff0c\u7c7b\u5bf9\u8c61\u4e0e\u5143\u7c7b\u5bf9\u8c61\u5747\u4e3aClass\u7c7b\u578b\uff1b 3\u3001\u6bcf\u521b\u5efa\u4e00\u4e2a\u5b9e\u4f8b\u90fd\u4f1a\u5728\u5185\u5b58\u4e2d\u65b0\u521b\u5efa\u4e00\u4e2a\u5b9e\u4f8b\u5bf9\u8c61\uff0c\u4f46\u7c7b\u5bf9\u8c61\u4e0e\u5143\u7c7b\u5bf9\u8c61\u53ea\u6709\u4e00\u4efd\uff1b 4\u3001\u7c7b\u7684\u6210\u5458\u53d8\u91cf\u503c\u4fdd\u5b58\u5728\u5b9e\u4f8b\u5bf9\u8c61\u4e2d\uff0c\u5bf9\u8c61\u65b9\u6cd5\u3001\u5c5e\u6027\u3001\u5c5e\u6027\u7c7b\u578b\u7b49\u4fe1\u606f\u4fdd\u5b58\u5728\u7c7b\u5bf9\u8c61\u4e2d\uff0c\u7c7b\u65b9\u6cd5\u4fdd\u5b58\u5728\u5143\u7c7b\u5bf9\u8c61\u4e2d\uff1b 5\u3001\u6240\u6709\u5bf9\u8c61\u90fd\u4f1a\u6709isa\u5c5e\u6027\u4e0esuperclass\u5c5e\u6027\uff1b 6\u3001isa\u6307\u9488\u7684\u6307\u5411\u4e3a\uff1aisntance->class->meta-class\uff1b 6.1\u3001\u5b9e\u4f8b\u5bf9\u8c61\u7684isa\u6307\u5411\u7c7b\u5bf9\u8c61\uff1b 6.2\u3001\u7c7b\u5bf9\u8c61\u7684isa\u6307\u5411\u5143\u7c7b\u5bf9\u8c61\uff1b 6.3\u3001\u5143\u7c7b\u5bf9\u8c61\u7684isa\u6307\u5411\u57fa\u7c7b\u7684\u5143\u7c7b\u5bf9\u8c61\uff0c\u5373OC\u4e2d\u6240\u6709\u5143\u7c7b\u5bf9\u8c61\u7684isa\u90fd\u6307\u5411NSObject\u7684\u5143\u7c7b\u5bf9\u8c61\uff1b 7\u3001superclass\u6307\u5411\u4e3a\u6307\u5411\u76f8\u5bf9\u5e94\u7684\u7236\u7c7b 7.1\u3001\u5b9e\u4f8b\u5bf9\u8c61\u7684superclass\u6307\u5411\u7c7b\u5bf9\u8c61\u7684\u7236\u7c7b\uff1b 7.2\u3001\u7c7b\u5bf9\u8c61\u7684superclass\u6307\u5411\u7c7b\u5bf9\u8c61\u7684\u7236\u7c7b\uff0c\u4f46\u57fa\u7c7b\u7c7b\u5bf9\u8c61\u7684superclass\u6307\u5411\u4e3anil\uff1b 7.3\u3001\u5143\u7c7b\u5bf9\u8c61\u7684superclass\u6307\u5411\u5143\u7c7b\u5bf9\u8c61\u7684\u7236\u7c7b\uff0c\u4f46\u57fa\u7c7b\u5143\u7c7b\u5bf9\u8c61\u7684superclass\u6307\u5411\u57fa\u7c7b\u7684\u7c7b\u5bf9\u8c61\uff1b 8\u3001\u57fa\u672c\u63cf\u8ff0\u56fe\u793a\uff1a 9\u3001\u4ee3\u7801\u9a8c\u8bc1 9.1\u3001Objective-C \/\/ \/\/ ViewController.m \/\/ lldb \/\/ \/\/ Created by \u4f59\u897f\u5b89 on 2018\/11\/1. \/\/ Copyright \u00a9 2018 yusian. All rights reserved. \/\/ #import &#8220;ViewController.h&#8221; #import @interface SAPerson : NSObject @end @implementation SAPerson @end @interface SAStudent : SAPerson @end @implementation SAStudent [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[5,173,179,180],"class_list":["post-1382","post","type-post","status-publish","format-standard","hentry","category-project","tag-objc","tag-oc","tag-runtime","tag-180"],"_links":{"self":[{"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/posts\/1382","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/comments?post=1382"}],"version-history":[{"count":0,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/posts\/1382\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/media?parent=1382"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/categories?post=1382"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/tags?post=1382"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}