69
()iOSカンケイ

Objective-Cのメモリ管理

Embed Size (px)

DESCRIPTION

Objective-Cのメモリ管理について ARCのアリ/ナシに分けて解説 AutoreleasePoolの正体など

Citation preview

  • 1. ()iOS

2. () (D) @Susan_jacko 3. Obj-C 4. Objective-C [] MI (q) () 5. Objective-C -iOS/OS X 6. 7. 8. Objective-Calloc / new / copy / mutableCopyretainreleasedealloc 9. 01alloc +1retain -1release 0dealloc 10. 11. { // +1 NSObject*obj = [[NSObject alloc]init];} {// NSObject *obj1 = [NSObject alloc]; NSObject *obj2 = [obj1 init]; } 12. 13. {0 NSArray +1 NSArray}*array1 = [NSArray array]; *array2 =[array1 retain]; 14. 15. { // +1 -1NSObject *obj = [[NSObject alloc]init]; [obj release];} {// 0 NSArray *array = -1 [array release];[NSArray array];} {NSArray *array = [NSArray array]; // OK+1 [array -1 [array}retain]; release]; 16. AutoReleasePool { int test = 0; } // ! { NSAutoreleasePool* pool = [[NSAutoreleasePool alloc]init];!+1 NSObject* obj = [[NSObject [obj -1() autorelease]; ! -1() [pool release]; } // alloc]init]; 17. AutoReleasePool NSAutoreleasePool{+1 0 } -1()NSArray* array = [NSArray array]; 18. 0 19. 20. ARC Automatic Reference Counting Mac OS X Lion iOS4 clang(LLVM ) 3.0 Xcode 4 21. ARC releaseretainNSObject __strong *obj = [[NSObject alloc]init]; 22. ARC while(true) { NSObject *obj = [[NSObject alloc]init]; [obj retain]; [obj retain]; [obj retain]; [obj retain]; [obj release]; [obj release]; [obj release]; [obj release]; [obj release]; } 23. 24. ARC __strong __weak __unsafe_unretained __autoreleasing 25. __strong 26. __strong {NSObject __strong *obj = [[NSObject alloc] init]; // // // } // obj{ NSArray __strong *array = [NSArray array]; // // // } // array 27. __strong NSObject *obj = [[NSObject alloc] init]; ! nil NSObject *obj; = 28. __strong 29. 30. class MyClass id __strong *myObj;{ MyClass __strong *objA = [[MyClass alloc]init]; MyClass __strong *objB = [[MyClass alloc]init]; objA.myObj = objB; objB.myObj = objA; } // objAobjB.myObjobjA // objAobjA.myObjobjB 31. objA.myObjobjB objAobjB.myObj 32. objAobjB 33. __weak 34. __weak class MyClass //id __strong *myObj;id __weak *myObj;{ MyClass __strong *objA = [[MyClass alloc]init]; MyClass __strong *objB = [[MyClass alloc]init]; objA.myObj = objB; objB.myObj = objA; } // objAobjB.myObjobjA // objAobjA.myObjobjB 35. __weak NSObject __weak *obj; if(obj == nil) { // nil } !{ }NSObject __strong *objA = [[NSObject alloc]init]; obj = objA;!if(obj == nil) { // nil } 36. __weak { NSObject __weak *objA = [[NSObject alloc]init]; } () 37. __unsafe_unretained NSObject __unsafe_unretained *obj; if(obj == nil) { // nil } { NSObject __strong *objA = [[NSObject alloc]init]; obj = objA; } if(obj == nil) { } // ...nil weak 38. __autoreleasing 39. __autoreleasing NSAutoreleasePoolARC 40. __autoreleasing autoreleaseARC { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; -1NSObject *obj = [[NSObject alloc]init]; [obj autorelease]; [pool release]; }ARC pool @autoreleasepool { NSObject __autoreleasing *obj = [[NSObject alloc]init]; } 41. __autoreleasing MyClass* getObj() { id __strong obj = [[NSObject alloc]init]; return obj; }autoreleasing 42. __autoreleasing NSObject __strong *obj; { // ANSObject __weak *objA = obj; !} ! {}NSLog(@"%@", objA);// B obj = [[NSObject alloc]init];A 43. __autoreleasing NSObject __strong *obj; { // A!}!@autoreleasepool { NSObject __weak *objA = obj;}NSObject __autoreleasing *tmp = objA; NSLog(@"%@", objA);__weak{__autoreleasing // B}@autoreleasepool { obj = [[NSObject alloc]init]; } 44. LLVM 45. ARC __strong__weak()__unsafe_unretained()__autoreleasingpool 46. ARC __strongOK () 47. ARC 48. 49. Pool {NSAutoreleasePool* pool = [[NSAutoreleasePool alloc]init]; NSObject* obj = [[NSObject alloc]init]; [obj autorelease];}[pool release]; 50. Pool {NSAutoreleasePool* pool = [[NSAutoreleasePool alloc]init]; NSObject* obj = [[NSObject alloc]init]; [pool addObject:obj]; // [obj autorelease];}for(id obj in pool.list) // [pool release]; { [obj release]; }autorelease 51. ARC MyClass* getObj() { id __strong obj = [[NSObject alloc]init]; return obj; } AutoreleasePool 52. MyClass *obj = getObj();MyClass* getObj()AutoreleasePoolMyClass *obj 53. __weak NSObject __strong *obj; ! !{ NSObject __weak *objA = obj; NSLog(@"%@", objA); NSLog(@"%@", objA); NSLog(@"%@", objA); }AutoreleasePool 54. __weak NSObject __strong *obj; ! ! { NSObject __weak *objA = obj; NSObject __autoreleasing *tmp = objA; NSLog(@"%@", objA); NSObject __autoreleasing *tmp = objA; NSLog(@"%@", objA); NSObject __autoreleasing *tmp = objA; NSLog(@"%@", objA); } 55. __weak weak = 1weak = 4 weak 56. __weak {}NSObject NSObject NSObject NSObject__strong *s_obj = [[NSObject alloc]init]; __weak *w_objA = s_obj; __weak *w_objB = s_obj; __weak *w_objC = s_obj; 57. __weak = 1s_objw_objB s_obj w_objA 58. __weak = 0s_objw_objB s_obj w_objA 59. __weak s_objs_obj 60. __weak s_objw_objB s_obj w_objA 61. __weak s_objnil s_obj nil 62. __weak s_objs_obj 63. __weak s_objs_obj 64. 65.