iOSDC 2017 9/15
サンプルコード https://github.com/objective-audio/objc_ptr_sample
[email protected]@TBNQMF0CKFDUJWF$Λͬͯ.3$Ͱշదʹ։ൃ͢Δ:VLJ:BTPTIJNB[email protected]
View Slide
[email protected]@TBNQMF0CKFDUJWF$ͷϝϞϦཧ
[email protected]@TBNQMF"VUPNBUJD3FGFSFODF$PVOUJOH"3$ࢀরΧϯλํࣜͷϝϞϦཧΛίϯύΠϥ͕ࣗಈͰߦͬͯ͘ΕΔ
[email protected]@TBNQMF"3$ͷઃఆ
[email protected]@TBNQMF.BOVBM3FGFSFODF$PVOUJOH.3$ࢀরΧϯλํࣜͷϝϞϦཧΛखಈͰߦ͏
[email protected]@TBNQMF.3$ͰͷϝϞϦཧTestClass *value = [[TestClass alloc] init];// ࢀরΧϯτ 1[value release];// ࢀরΧϯτ 0
[email protected]@TBNQMF.3$ͰͷϝϞϦཧNSNumber *value = [[NSNumber alloc] initWithInt:1];[value retain]; // ࢀরΧϯτ 2[value release]; // ࢀরΧϯτ 1[value release]; // ࢀরΧϯτ 0
[email protected]@TBNQMF.3$ͰͷϝϞϦཧ@autoreleasepool {NSNumber *value = [[NSNumber alloc] initWithInt:1];[value autorelease]; // ࢀরΧϯτ = 1 (- 1)...} // ࢀরΧϯτ = 0
[email protected]@TBNQMF"3$ͷ߹ͷΫϥε࣮@implementation Sample {NSNumber *_value;}- (void)setValue:(NSNumber *)value {_value = value;}- (NSNumber *)value {return _value;}@end
[email protected]@TBNQMF.3$ͷ߹ͷΫϥε࣮@implementation Sample {NSNumber *_value;}- (void)setValue:(NSNumber *)value {[value retain];[_value release];_value = value;}- (NSNumber *)value {return [[_value retain] autorelease];}- (void)dealloc{[_value release];[super dealloc];}@end
[email protected]@TBNQMF0CKFDUJWF$
[email protected]@TBNQMF֦ுࢠΛNNʹ͢Δ
[email protected]@TBNQMFࣅͨػೳͷݺͼํͷҧ͍0CKFDUJWF$ 4XJGU $Πϯελϯεมɾϝιου ϝϯόมɾؔΠχγϟϥΠβ ίϯετϥΫλδΣωϦΫε ςϯϓϨʔτϒϩοΫɾΫϩʔδϟ ϥϜμࣜ
[email protected]@TBNQMF0CKFDUJWF$#import #import #import void Sample() {NSString *objcText = @"Obj-C Text";NSLog(@"%@", objcText);std::string cppText = "C++ Text";std::cout << cppText << std::endl;}
[email protected]@TBNQMF0CKFDUJWF$@implementation ObjcClass {std::string _text;}- (void)setText:(std::string const &)text {_text = text;}- (std::string const &)text {return _text;}@end
[email protected]@TBNQMF0CKFDUJWF$class CppClass {NSString *_text;public:void setText(NSString *text) {_text = text;}NSString *text() {return _text;}};
IUUQTHJUIVCDPNPCKFDUJWFBVEJP[email protected]@TBNQMF$ͷϝϞϦཧ
[email protected]@TBNQMF$ΦϒδΣΫτͷΠϯελϯεԽCppClass *pointer = new CppClass();delete pointer;
[email protected]@TBNQMF$ΦϒδΣΫτͷΠϯελϯεԽCppClass value_1;CppClass value_2(2);CppClass value_3{3};CppClass value_4 = CppClass(4);auto value_5 = CppClass(5);
[email protected]@TBNQMFղ์͞ΕΔλΠϛϯάʢؔʣvoid SampleFunc() {CppClass value;} // <- valueؔͷείʔϓΛൈ͚Δ࣌ʹղ์͞ΕΔ
[email protected]@TBNQMFղ์͞ΕΔλΠϛϯάʢؔʣvoid SampleFunc() {if (true) {CppClass value;} // <- valueJGͷείʔϓΛൈ͚Δ࣌ʹղ์͞ΕΔ}
[email protected]@TBNQMFղ์͞ΕΔλΠϛϯάʢ$Ϋϥεʣclass CppParentClass {public:CppClass value;~CppParentClass() {} // <- σετϥΫλ͕ݺΕͨޙʹϝϯόมvalue͕ղ์͞ΕΔ};
[email protected]@TBNQMFղ์͞ΕΔλΠϛϯάʢ0CK$Ϋϥεʣ@implementation ObjcParent {CppClass value;}- (void)dealloc {[super dealloc];// <- deallocͷதͰΠϯελϯεม͕ղ์͞ΕΔ}@end
[email protected]@TBNQMF0CKFDUJWF$ͷΦϒδΣΫτΛอ࣋͢Δ$ͷΫϥεΛ࡞Δ
[email protected]@TBNQMF0CKFDUJWF$ͷΦϒδΣΫτΛอ࣋͢Δ$ͷΫϥεΛ࡞ͬͨ
[email protected]@TBNQMF[email protected]//// objc_ptr.hpp//#pragma once#include #include template class objc_impl {public:T const value;objc_impl(T value) : value(value) {[value retain];}~objc_impl() {[value release];}};template class weak_objc_ptr;template objc_ptr make_objc_ptr(T value) {objc_ptr ptr(value);[value release];return ptr;}template class weak_objc_ptr {std::weak_ptr> _impl;public:weak_objc_ptr() = default;weak_objc_ptr(objc_ptr ptr) : _impl(ptr._impl) {}objc_ptr lock() const {if (auto locked = _impl.lock()) {return objc_ptr(locked);} else {return objc_ptr();}}};template weak_objc_ptr to_weak(objc_ptr ptr) {return weak_objc_ptr(ptr);}template class objc_ptr {friend class weak_objc_ptr;std::shared_ptr> _impl;objc_ptr(std::shared_ptr> holder) : _impl(holder) {}public:objc_ptr() : objc_ptr(nil) {}objc_ptr(T value) : _impl(std::make_shared>(value)) {}objc_ptr(std::function handler) {@autoreleasepool {_impl = std::make_shared>(handler());}}T value() const {return _impl->value;}T operator*() const {return _impl->value;}explicit operator bool() const {return _impl->value != nil;}};
[email protected]@TBNQMF[email protected][email protected]@JNQM5[email protected]Ϋϥεͷߏ[email protected]˞50CKFDUJWF$ͷΫϥεͷܕʢʮ/44USJOHʯͳͲʣ5WBMVFʢSFUBJOͯ͠อ࣋ʣ
[email protected]@TBNQMF[email protected]ͷ༻ྫ
[email protected]@TBNQMFSFUBJOͯ͠อ࣋͢ΔTestClass *testObj = [[[TestClass alloc] init] autorelease];objc_ptr test_ptr(testObj);NSLog(@"value : %@", test_ptr.value());NSLog(@"value : %@", *test_ptr);
[email protected]@TBNQMFࢀরΧϯτͦͷ··อ࣋͢Δauto test_ptr = make_objc_ptr([[TestClass alloc] init]);NSLog(@“value : %@", *test_ptr);
[email protected]@TBNQMFBVUPSFMFBTFΛ֎ͯ͠อ࣋͢Δobjc_ptr test_ptr([]() {return [[[TestClass alloc] init] autorelease];});NSLog(@"value : %@", *test_ptr);
[email protected]@TBNQMFऑࢀরͰอ࣋͢Δauto test_ptr = make_objc_ptr([[TestClass alloc] init]);weak_objc_ptr weak_ptr = test_ptr;if (auto locked_ptr = weak_ptr.lock()) {NSLog(@"value : %@", *locked_ptr);}
[email protected]@TBNQMFऑࢀরΛฦؔ͢auto test_ptr = make_objc_ptr([[TestClass alloc] init]);auto weak_ptr = to_weak(test_ptr);auto handler = [weak_ptr]() {auto locked_ptr = weak_ptr.lock();NSLog(@"locked value : %@", locked_ptr.value());};handler();
[email protected]@TBNQMFΠϯελϯεมͰ͏@implementation Sample {objc_ptr _value;}- (void)setValue:(NSNumber *)value {_value = value;}- (NSNumber *)value {return *_value;}@end
[email protected]@TBNQMFͭͷ0CKFDUJWF$ΦϒδΣΫτΛෳͷ[email protected]ʹ࣋ͨͤͳ͍ํ͕ྑ͍ʢಛʹXFBLΛ͏߹ʣ༻্ͷҙ
[email protected]@TBNQMF[email protected]ಉ࢜ΛൺֱͰ͖ΔΑ͏ʹ͢ΔɺͳͲ"3$ͱ.3$Λ[email protected]Ͱٵऩ͢Δ͞Βʹൃలͤ͞Δ
[email protected]@TBNQMF͓ΘΓ