├── Demo-PlanStep-1 ├── Demo-PlanStep-1.xcodeproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcuserdata │ │ │ └── Unique.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ ├── xcuserdata │ │ └── Unique.xcuserdatad │ │ │ ├── xcdebugger │ │ │ └── Breakpoints_v2.xcbkptlist │ │ │ └── xcschemes │ │ │ ├── xcschememanagement.plist │ │ │ └── Demo-PlanStep-1.xcscheme │ └── project.pbxproj └── Demo-PlanStep-1 │ ├── MUHostClass.m │ ├── MUHostClass.h │ ├── MUValueClass.h │ ├── MUHostClass+Association.h │ ├── main.m │ ├── MUHostClass+Association.m │ └── MUValueClass.m ├── Demo-PlanStep-2 ├── Demo-PlanStep-2.xcodeproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcuserdata │ │ │ └── Unique.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ ├── xcuserdata │ │ └── Unique.xcuserdatad │ │ │ └── xcschemes │ │ │ ├── xcschememanagement.plist │ │ │ └── Demo-PlanStep-2.xcscheme │ └── project.pbxproj └── Demo-PlanStep-2 │ ├── MUHostClass.m │ ├── MUValueClass.m │ ├── MUHostClass.h │ ├── MUValueClass.h │ ├── MUHostClass+Association.h │ ├── NSObject+MUWeakTask.h │ ├── MUWeakTask.h │ ├── main.m │ ├── NSObject+MUWeakTask.m │ ├── MUWeakTask.m │ └── MUHostClass+Association.m ├── Demo-PlanStep-Release ├── Demo-PlanStep-Release.xcodeproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcuserdata │ │ │ └── Unique.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ ├── xcuserdata │ │ └── Unique.xcuserdatad │ │ │ ├── xcdebugger │ │ │ └── Breakpoints_v2.xcbkptlist │ │ │ └── xcschemes │ │ │ ├── xcschememanagement.plist │ │ │ └── Demo-PlanStep-Release.xcscheme │ └── project.pbxproj └── Demo-PlanStep-Release │ ├── NSObject+SubObj.h │ ├── NSObject+SubObj.m │ └── main.m ├── Assosiation ├── MUAssosiation.h ├── MUDeallocTask.h ├── NSObject+Dealloc.h ├── NSObject+Association.h ├── NSObject+Dealloc.m ├── NSObject+Association.m └── MUDeallocTask.m └── README.md /Demo-PlanStep-1/Demo-PlanStep-1.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Demo-PlanStep-2/Demo-PlanStep-2.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Demo-PlanStep-Release/Demo-PlanStep-Release.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Demo-PlanStep-1/Demo-PlanStep-1/MUHostClass.m: -------------------------------------------------------------------------------- 1 | // 2 | // MUHostClass.m 3 | // Demo-PlanStep-1 4 | // 5 | // Created by 吴双 on 16/8/13. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import "MUHostClass.h" 10 | 11 | @implementation MUHostClass 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Demo-PlanStep-2/Demo-PlanStep-2/MUHostClass.m: -------------------------------------------------------------------------------- 1 | // 2 | // MUHostClass.m 3 | // Demo-PlanStep-2 4 | // 5 | // Created by 吴双 on 16/8/13. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import "MUHostClass.h" 10 | 11 | @implementation MUHostClass 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Demo-PlanStep-2/Demo-PlanStep-2/MUValueClass.m: -------------------------------------------------------------------------------- 1 | // 2 | // MUValueClass.m 3 | // Demo-PlanStep-2 4 | // 5 | // Created by 吴双 on 16/8/13. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import "MUValueClass.h" 10 | 11 | @implementation MUValueClass 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Demo-PlanStep-1/Demo-PlanStep-1.xcodeproj/project.xcworkspace/xcuserdata/Unique.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Magic-Unique/Weak-Category-by-Runtime/HEAD/Demo-PlanStep-1/Demo-PlanStep-1.xcodeproj/project.xcworkspace/xcuserdata/Unique.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /Demo-PlanStep-2/Demo-PlanStep-2.xcodeproj/project.xcworkspace/xcuserdata/Unique.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Magic-Unique/Weak-Category-by-Runtime/HEAD/Demo-PlanStep-2/Demo-PlanStep-2.xcodeproj/project.xcworkspace/xcuserdata/Unique.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /Demo-PlanStep-2/Demo-PlanStep-2/MUHostClass.h: -------------------------------------------------------------------------------- 1 | // 2 | // MUHostClass.h 3 | // Demo-PlanStep-2 4 | // 5 | // Created by 吴双 on 16/8/13. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface MUHostClass : NSObject 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Demo-PlanStep-2/Demo-PlanStep-2/MUValueClass.h: -------------------------------------------------------------------------------- 1 | // 2 | // MUValueClass.h 3 | // Demo-PlanStep-2 4 | // 5 | // Created by 吴双 on 16/8/13. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface MUValueClass : NSObject 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Demo-PlanStep-Release/Demo-PlanStep-Release.xcodeproj/project.xcworkspace/xcuserdata/Unique.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Magic-Unique/Weak-Category-by-Runtime/HEAD/Demo-PlanStep-Release/Demo-PlanStep-Release.xcodeproj/project.xcworkspace/xcuserdata/Unique.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /Assosiation/MUAssosiation.h: -------------------------------------------------------------------------------- 1 | // 2 | // MUAssosiation.h 3 | // Demo-PlanStep-Release 4 | // 5 | // Created by 吴双 on 16/8/14. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #ifndef MUAssosiation_h 10 | #define MUAssosiation_h 11 | 12 | #import "NSObject+Association.h" 13 | 14 | 15 | #endif /* MUAssosiation_h */ 16 | -------------------------------------------------------------------------------- /Demo-PlanStep-1/Demo-PlanStep-1/MUHostClass.h: -------------------------------------------------------------------------------- 1 | // 2 | // MUHostClass.h 3 | // Demo-PlanStep-1 4 | // 5 | // Created by 吴双 on 16/8/13. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | // 这是“宿主对象”类的主要实现,.m 文件可以无视 12 | 13 | @interface MUHostClass : NSObject 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Demo-PlanStep-1/Demo-PlanStep-1/MUValueClass.h: -------------------------------------------------------------------------------- 1 | // 2 | // MUValueClass.h 3 | // Demo-PlanStep-1 4 | // 5 | // Created by 吴双 on 16/8/13. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | // 这是值对象的实现 10 | 11 | #import 12 | 13 | @interface MUValueClass : NSObject 14 | 15 | - (void)setWeakReference:(id)hostObj forWipeSEL:(SEL)wipeSEL; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Demo-PlanStep-1/Demo-PlanStep-1/MUHostClass+Association.h: -------------------------------------------------------------------------------- 1 | // 2 | // MUHostClass+Association.h 3 | // Demo-PlanStep-1 4 | // 5 | // Created by 吴双 on 16/8/13. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import "MUHostClass.h" 10 | #import "MUValueClass.h" 11 | 12 | @interface MUHostClass (Association) 13 | 14 | @property (nonatomic, weak) MUValueClass *valueObject; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /Demo-PlanStep-2/Demo-PlanStep-2/MUHostClass+Association.h: -------------------------------------------------------------------------------- 1 | // 2 | // MUHostClass+Association.h 3 | // Demo-PlanStep-2 4 | // 5 | // Created by 吴双 on 16/8/13. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import "MUHostClass.h" 10 | #import "MUValueClass.h" 11 | 12 | @interface MUHostClass (Association) 13 | 14 | @property (nonatomic, weak) MUValueClass *valueObject; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /Demo-PlanStep-2/Demo-PlanStep-2/NSObject+MUWeakTask.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+MUWeakTask.h 3 | // Demo-PlanStep-2 4 | // 5 | // Created by 吴双 on 16/8/13. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | typedef void(^TaskBlock)(void); 12 | 13 | @interface NSObject (MUWeakTask) 14 | 15 | - (void)setWeakReferenceTask:(TaskBlock)task; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Demo-PlanStep-Release/Demo-PlanStep-Release/NSObject+SubObj.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+SubObj.h 3 | // Demo-PlanStep-Release 4 | // 5 | // Created by 吴双 on 16/8/14. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface NSObject (SubObj) 12 | 13 | @property (nonatomic, weak) NSObject *subObj; 14 | 15 | @property (nonatomic, weak) NSObject *superObj; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Assosiation/MUDeallocTask.h: -------------------------------------------------------------------------------- 1 | // 2 | // MUDeallocTask.h 3 | // RuntimeWeak 4 | // 5 | // Created by unique on 16/8/11. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | typedef void(^DeallocBlock)(void); 12 | 13 | @interface MUDeallocTask : NSObject 14 | 15 | - (void)addTask:(DeallocBlock)task forTarget:(id)target key:(NSString *)key; 16 | 17 | - (void)removeTaskForTarget:(id)target key:(NSString *)key; 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /Assosiation/NSObject+Dealloc.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+Dealloc.h 3 | // RuntimeWeak 4 | // 5 | // Created by unique on 16/8/11. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | typedef void(^DeallocBlock)(void); 12 | 13 | @interface NSObject (Dealloc) 14 | 15 | - (void)addDeallocTask:(DeallocBlock)task forTarget:(id)target key:(NSString *)key; 16 | 17 | - (void)removeDeallocTaskForTarget:(id)target key:(NSString *)key; 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /Demo-PlanStep-2/Demo-PlanStep-2/MUWeakTask.h: -------------------------------------------------------------------------------- 1 | // 2 | // MUWeakTask.h 3 | // Demo-PlanStep-2 4 | // 5 | // Created by 吴双 on 16/8/13. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | typedef void(^TaskBlock)(void); 12 | 13 | @interface MUWeakTask : NSObject 14 | 15 | @property (nonatomic, readonly) TaskBlock taskBlock; 16 | 17 | - (instancetype)initWithTaskBlock:(TaskBlock)taskBlock; 18 | + (instancetype)taskWithTaskBlock:(TaskBlock)taskBlock; 19 | 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /Demo-PlanStep-2/Demo-PlanStep-2/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // Demo-PlanStep-2 4 | // 5 | // Created by 吴双 on 16/8/13. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "MUHostClass+Association.h" 11 | 12 | int main(int argc, const char * argv[]) { 13 | @autoreleasepool { 14 | MUHostClass *hostObj = [MUHostClass new]; 15 | @autoreleasepool { 16 | MUValueClass *valueObj = [MUValueClass new]; 17 | hostObj.valueObject = valueObj; 18 | NSLog(@"%@", hostObj.valueObject); 19 | } 20 | NSLog(@"%@", hostObj.valueObject); 21 | } 22 | return 0; 23 | } 24 | -------------------------------------------------------------------------------- /Demo-PlanStep-1/Demo-PlanStep-1/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // Demo-PlanStep-1 4 | // 5 | // Created by 吴双 on 16/8/13. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "MUHostClass+Association.h" 11 | 12 | 13 | int main(int argc, const char * argv[]) { 14 | @autoreleasepool { 15 | MUHostClass *hostObj = [MUHostClass new]; 16 | @autoreleasepool { 17 | MUValueClass *valueObj = [MUValueClass new]; 18 | hostObj.valueObject = valueObj; 19 | NSLog(@"%@", hostObj.valueObject); 20 | } 21 | NSLog(@"%@", hostObj.valueObject); 22 | } 23 | return 0; 24 | } 25 | -------------------------------------------------------------------------------- /Demo-PlanStep-2/Demo-PlanStep-2/NSObject+MUWeakTask.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+MUWeakTask.m 3 | // Demo-PlanStep-2 4 | // 5 | // Created by 吴双 on 16/8/13. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import "NSObject+MUWeakTask.h" 10 | #import "MUWeakTask.h" 11 | #import 12 | 13 | @implementation NSObject (MUWeakTask) 14 | 15 | static const char kWeakTask = '0'; 16 | 17 | - (void)setWeakReferenceTask:(TaskBlock)task { 18 | MUWeakTask *weakTask = [MUWeakTask taskWithTaskBlock:task]; 19 | objc_setAssociatedObject(self, &kWeakTask, weakTask, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 20 | } 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /Demo-PlanStep-1/Demo-PlanStep-1.xcodeproj/xcuserdata/Unique.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /Demo-PlanStep-Release/Demo-PlanStep-Release.xcodeproj/xcuserdata/Unique.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /Demo-PlanStep-1/Demo-PlanStep-1.xcodeproj/xcuserdata/Unique.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Demo-PlanStep-1.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | D4A9E0431D5EA95C0032DF17 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Demo-PlanStep-2/Demo-PlanStep-2.xcodeproj/xcuserdata/Unique.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Demo-PlanStep-2.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | D4A9E06E1D5EB0B40032DF17 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Demo-PlanStep-2/Demo-PlanStep-2/MUWeakTask.m: -------------------------------------------------------------------------------- 1 | // 2 | // MUWeakTask.m 3 | // Demo-PlanStep-2 4 | // 5 | // Created by 吴双 on 16/8/13. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import "MUWeakTask.h" 10 | 11 | @implementation MUWeakTask 12 | 13 | - (instancetype)initWithTaskBlock:(TaskBlock)taskBlock { 14 | self = [super init]; 15 | if (self) { 16 | _taskBlock = [taskBlock copy]; 17 | } 18 | return self; 19 | } 20 | 21 | + (instancetype)taskWithTaskBlock:(TaskBlock)taskBlock { 22 | return [[self alloc] initWithTaskBlock:taskBlock]; 23 | } 24 | 25 | - (void)dealloc { 26 | if (self.taskBlock) { 27 | self.taskBlock(); 28 | } 29 | } 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /Demo-PlanStep-Release/Demo-PlanStep-Release.xcodeproj/xcuserdata/Unique.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Demo-PlanStep-Release.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | D4E07A841D60B418006E2F90 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Assosiation/NSObject+Association.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+Association.h 3 | // RuntimeWeak 4 | // 5 | // Created by unique on 16/8/11. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | typedef NS_ENUM(NSUInteger, NSAssociation) { 12 | NSAssociationAssign,// = 0x0001, 13 | NSAssociationRetain,// = 0x0010, 14 | NSAssociationCopy,// = 0x0100, 15 | NSAssociationWeak,// = 0x1000, 16 | }; 17 | 18 | @interface NSObject (Association) 19 | 20 | - (void)setAssociatedObject:(id)object forKey:(NSString *)key association:(NSAssociation)association isAtomic:(BOOL)isAtomic; 21 | 22 | - (id)associatedObjectForKey:(NSString *)key; 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Weak-Category-by-Runtime 2 | 3 | A tool to create weakly property in category. **[explain](http://www.jianshu.com/p/ed65d71554d8)** 4 | 5 | 一个在分类中创建弱引用属性的工具,**[原文链接](http://www.jianshu.com/p/ed65d71554d8)**。 6 | 7 | ## USAGE 使用 8 | 9 | ```objective-c 10 | // in a category... 11 | 12 | #import "MUAssociation.h" 13 | 14 | // @property (nonatomic, weak) id someProperty; // write in .h file 15 | 16 | @implementation SomeClass (SomeCategory) 17 | 18 | - (void)setSomeProperty:(id)someProperty { 19 | [self setAssociatedObject:someProperty forKey:@"someProperty" association:NSAssociationWeak isAtomic:NO]; 20 | } 21 | 22 | - (id)someProperty { 23 | return [self associatedObjectForKey:@"someProperty"]; 24 | } 25 | 26 | @end 27 | ``` 28 | 29 | -------------------------------------------------------------------------------- /Demo-PlanStep-1/Demo-PlanStep-1/MUHostClass+Association.m: -------------------------------------------------------------------------------- 1 | // 2 | // MUHostClass+Association.m 3 | // Demo-PlanStep-1 4 | // 5 | // Created by 吴双 on 16/8/13. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import "MUHostClass+Association.h" 10 | #import 11 | 12 | @implementation MUHostClass (Association) 13 | 14 | const static char kValueObject = '0'; 15 | 16 | - (void)setValueObject:(MUValueClass *)valueObject { 17 | objc_setAssociatedObject(self, &kValueObject, valueObject, OBJC_ASSOCIATION_ASSIGN); 18 | [valueObject setWeakReference:self forWipeSEL:@selector(setValueObject:)]; 19 | } 20 | 21 | - (MUValueClass *)valueObject { 22 | return objc_getAssociatedObject(self, &kValueObject); 23 | } 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /Demo-PlanStep-1/Demo-PlanStep-1/MUValueClass.m: -------------------------------------------------------------------------------- 1 | // 2 | // MUValueClass.m 3 | // Demo-PlanStep-1 4 | // 5 | // Created by 吴双 on 16/8/13. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import "MUValueClass.h" 10 | 11 | @interface MUValueClass () 12 | { 13 | __weak id _hostObj; 14 | SEL _hostWipeSEL; 15 | } 16 | 17 | @end 18 | 19 | @implementation MUValueClass 20 | 21 | - (void)setWeakReference:(id)hostObj forWipeSEL:(SEL)wipeSEL { 22 | _hostObj = hostObj; 23 | _hostWipeSEL = wipeSEL; 24 | } 25 | 26 | - (void)dealloc { 27 | // 此处用宏取消 ARC 的警告 28 | #pragma clang diagnostic push // 创建取消警告域 29 | #pragma clang diagnostic ignored "-Warc-performSelector-leaks" 30 | [_hostObj performSelector:_hostWipeSEL withObject:nil]; 31 | #pragma clang diagnostic pop // 关闭取消警告域 32 | } 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /Demo-PlanStep-Release/Demo-PlanStep-Release/NSObject+SubObj.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+SubObj.m 3 | // Demo-PlanStep-Release 4 | // 5 | // Created by 吴双 on 16/8/14. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import "NSObject+SubObj.h" 10 | #import "MUAssosiation.h" 11 | 12 | @implementation NSObject (SubObj) 13 | 14 | - (void)setSubObj:(NSObject *)subObj { 15 | [self setAssociatedObject:subObj forKey:@"subObj" association:NSAssociationWeak isAtomic:NO]; 16 | } 17 | 18 | - (NSObject *)subObj { 19 | return [self associatedObjectForKey:@"subObj"]; 20 | } 21 | 22 | - (void)setSuperObj:(NSObject *)superObj { 23 | [self setAssociatedObject:superObj forKey:@"superObj" association:NSAssociationWeak isAtomic:NO]; 24 | } 25 | 26 | - (NSObject *)superObj { 27 | return [self associatedObjectForKey:@"superObj"]; 28 | } 29 | 30 | @end 31 | -------------------------------------------------------------------------------- /Assosiation/NSObject+Dealloc.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+Dealloc.m 3 | // RuntimeWeak 4 | // 5 | // Created by unique on 16/8/11. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import "NSObject+Dealloc.h" 10 | 11 | #import 12 | 13 | #import "MUDeallocTask.h" 14 | 15 | @implementation NSObject (Dealloc) 16 | 17 | static const char kTask = '0'; 18 | 19 | - (MUDeallocTask *)deallocTask { 20 | MUDeallocTask *task = objc_getAssociatedObject(self, &kTask); 21 | if (!task) { 22 | task = [MUDeallocTask new]; 23 | objc_setAssociatedObject(self, &kTask, task, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 24 | } 25 | return task; 26 | } 27 | 28 | - (void)addDeallocTask:(DeallocBlock)task forTarget:(id)target key:(NSString *)key { 29 | [self.deallocTask addTask:task forTarget:target key:key]; 30 | } 31 | 32 | - (void)removeDeallocTaskForTarget:(id)target key:(NSString *)key { 33 | [self.deallocTask removeTaskForTarget:target key:key]; 34 | } 35 | 36 | @end 37 | -------------------------------------------------------------------------------- /Demo-PlanStep-2/Demo-PlanStep-2/MUHostClass+Association.m: -------------------------------------------------------------------------------- 1 | // 2 | // MUHostClass+Association.m 3 | // Demo-PlanStep-2 4 | // 5 | // Created by 吴双 on 16/8/13. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import "MUHostClass+Association.h" 10 | #import 11 | #import "NSObject+MUWeakTask.h" 12 | 13 | @implementation MUHostClass (Association) 14 | 15 | const static char kValueObject = '0'; 16 | 17 | - (void)setValueObject:(MUValueClass *)valueObject { 18 | objc_setAssociatedObject(self, &kValueObject, valueObject, OBJC_ASSOCIATION_ASSIGN); 19 | /** 20 | * 虽然这里没有循环引用,但是还是需要用弱引用丢给 block 21 | * 因为 valueObj 持有 weakTask,weakTask 持有 block,block 持有 self 22 | * 因此 self 至少要等到 valueObj 销毁后才能销毁。严重影响到 self 的生命周期 23 | * 这是参考答案中的一个缺点 24 | * 25 | * 而使用传递 block 的方式清空属性,而不是传递 set 方法的 SEL 的方式,是为了防止形成递归 26 | */ 27 | __weak typeof(self) wself = self; 28 | [valueObject setWeakReferenceTask:^{ 29 | objc_setAssociatedObject(wself, &kValueObject, nil, OBJC_ASSOCIATION_ASSIGN); 30 | }]; 31 | } 32 | 33 | - (MUValueClass *)valueObject { 34 | return objc_getAssociatedObject(self, &kValueObject); 35 | } 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /Demo-PlanStep-Release/Demo-PlanStep-Release/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // Demo-PlanStep-Release 4 | // 5 | // Created by 吴双 on 16/8/14. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "NSObject+SubObj.h" 12 | 13 | void scene0() { 14 | // 场景零,一般情况 15 | @autoreleasepool { 16 | NSObject *hostObj = [NSObject new]; 17 | @autoreleasepool { 18 | NSObject *valueObj = [NSObject new]; 19 | hostObj.subObj = valueObj; 20 | NSLog(@"SENE-0 set value: %@", hostObj.subObj); 21 | } 22 | NSLog(@"SENE-0 after release: %@", hostObj.subObj); 23 | } 24 | } 25 | 26 | void scene1() { 27 | // 场景一,host 重复设置值 28 | 29 | @autoreleasepool { 30 | // 旧值先销毁 31 | NSObject *hostObj = NSObject.new; 32 | NSObject *newValue = NSObject.new; 33 | @autoreleasepool { 34 | NSObject *oldValue = NSObject.new; 35 | hostObj.subObj = oldValue; 36 | NSLog(@"SENE-1.1 set old value: %@", hostObj.subObj); 37 | hostObj.subObj = newValue; 38 | NSLog(@"SENE-1.1 set new value: %@", hostObj.subObj); 39 | } 40 | NSLog(@"SENE-1.1 after release old: %@", hostObj.subObj); 41 | } 42 | 43 | NSLog(@"-------------------------"); 44 | 45 | @autoreleasepool { 46 | // 新值先销毁 47 | NSObject *hostObj = NSObject.new; 48 | NSObject *oldValue = NSObject.new; 49 | hostObj.subObj = oldValue; 50 | NSLog(@"SENE-1.2 set old value: %@", hostObj.subObj); 51 | @autoreleasepool { 52 | NSObject *newValue = NSObject.new; 53 | hostObj.subObj = newValue; 54 | NSLog(@"SENE-1.2 set new value: %@", hostObj.subObj); 55 | } 56 | NSLog(@"SENE-1.2 after release new: %@", hostObj.subObj); 57 | } 58 | } 59 | 60 | void scene2() { 61 | // 场景二 【同 host + 不同属性】 62 | @autoreleasepool { 63 | NSObject *hostObj = NSObject.new; 64 | @autoreleasepool { 65 | NSObject *valueObj = NSObject.new; 66 | hostObj.subObj = valueObj; 67 | hostObj.superObj = valueObj; 68 | NSLog(@"%@, %@", hostObj.subObj, hostObj.superObj); 69 | } 70 | NSLog(@"%@, %@", hostObj.subObj, hostObj.superObj); 71 | } 72 | } 73 | 74 | void scene3() { 75 | // 场景三 【不同 host + 同属性】 76 | @autoreleasepool { 77 | NSObject *hostObj1 = NSObject.new; 78 | NSObject *hostObj2 = NSObject.new; 79 | @autoreleasepool { 80 | NSObject *valueObj = NSObject.new; 81 | hostObj1.subObj = valueObj; 82 | hostObj2.subObj = valueObj; 83 | NSLog(@"%@, %@", hostObj1.subObj, hostObj2.subObj); 84 | } 85 | NSLog(@"%@, %@", hostObj1.subObj, hostObj2.subObj); 86 | } 87 | } 88 | 89 | int main(int argc, const char * argv[]) { 90 | @autoreleasepool { 91 | scene2(); 92 | } 93 | return 0; 94 | } 95 | -------------------------------------------------------------------------------- /Assosiation/NSObject+Association.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+Association.m 3 | // RuntimeWeak 4 | // 5 | // Created by unique on 16/8/11. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import "NSObject+Association.h" 10 | 11 | #import 12 | 13 | #import "NSObject+Dealloc.h" 14 | 15 | static NSMutableDictionary *keyBuffer; 16 | 17 | @implementation NSObject (Association) 18 | 19 | + (void)load { 20 | keyBuffer = [NSMutableDictionary dictionary]; 21 | } 22 | 23 | - (void)setAssociatedObject:(id)object forKey:(NSString *)key association:(NSAssociation)association isAtomic:(BOOL)isAtomic { 24 | const char *cKey = [keyBuffer[key] pointerValue]; 25 | if (cKey == NULL) { 26 | cKey = key.UTF8String; 27 | keyBuffer[key] = [NSValue valueWithPointer:cKey]; 28 | } 29 | switch (association) { 30 | case NSAssociationAssign: 31 | objc_setAssociatedObject(self, cKey, object, OBJC_ASSOCIATION_ASSIGN); 32 | break; 33 | case NSAssociationRetain: 34 | if (isAtomic) { 35 | objc_setAssociatedObject(self, cKey, object, OBJC_ASSOCIATION_RETAIN); 36 | } else { 37 | 38 | objc_setAssociatedObject(self, cKey, object, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 39 | } 40 | break; 41 | case NSAssociationCopy: 42 | if (isAtomic) { 43 | objc_setAssociatedObject(self, cKey, object, OBJC_ASSOCIATION_COPY); 44 | } else { 45 | 46 | objc_setAssociatedObject(self, cKey, object, OBJC_ASSOCIATION_COPY_NONATOMIC); 47 | } 48 | break; 49 | case NSAssociationWeak: 50 | [self _setWeakObject:object forKey:key]; 51 | break; 52 | default: 53 | break; 54 | } 55 | } 56 | 57 | - (void)_setWeakObject:(id)object forKey:(NSString *)key { 58 | const char *cKey = [keyBuffer[key] pointerValue]; 59 | __weak typeof(self) wself = self; 60 | 61 | id oldObj = objc_getAssociatedObject(self, cKey); 62 | [oldObj removeDeallocTaskForTarget:wself key:key]; 63 | 64 | objc_setAssociatedObject(self, cKey, object, OBJC_ASSOCIATION_ASSIGN); 65 | [object addDeallocTask:^{ 66 | objc_setAssociatedObject(wself, cKey, nil, OBJC_ASSOCIATION_ASSIGN); 67 | } forTarget:wself key:key]; 68 | } 69 | 70 | - (id)associatedObjectForKey:(NSString *)key { 71 | const char *cKey = [keyBuffer[key] pointerValue]; 72 | if (cKey == NULL) { 73 | return nil; 74 | } else { 75 | return objc_getAssociatedObject(self, cKey); 76 | } 77 | } 78 | 79 | @end 80 | -------------------------------------------------------------------------------- /Assosiation/MUDeallocTask.m: -------------------------------------------------------------------------------- 1 | // 2 | // MUDeallocTask.m 3 | // RuntimeWeak 4 | // 5 | // Created by unique on 16/8/11. 6 | // Copyright © 2016年 unique. All rights reserved. 7 | // 8 | 9 | #import "MUDeallocTask.h" 10 | 11 | 12 | @interface MUDeallocTaskItem : NSObject 13 | 14 | @property (nonatomic, weak, readonly) id target; 15 | @property (nonatomic, copy, readonly) NSString *key; 16 | @property (nonatomic, copy, readonly) DeallocBlock task; 17 | 18 | - (instancetype)initWithTarget:(id)target key:(NSString *)key task:(DeallocBlock)task; 19 | + (instancetype)taskItemWithTarget:(id)target key:(NSString *)key task:(DeallocBlock)task; 20 | 21 | @end 22 | 23 | @interface MUDeallocTask () 24 | 25 | @property (nonatomic, strong) NSMutableSet *taskSet; 26 | 27 | @end 28 | 29 | 30 | @implementation MUDeallocTask 31 | 32 | - (void)addTask:(DeallocBlock)task forTarget:(id)target key:(NSString *)key { 33 | MUDeallocTaskItem *taskItem = [MUDeallocTaskItem taskItemWithTarget:target key:key task:task]; 34 | if ([self.taskSet containsObject:taskItem]) { 35 | [self.taskSet removeObject:taskItem]; 36 | } 37 | [self.taskSet addObject:taskItem]; 38 | } 39 | 40 | - (void)removeTaskForTarget:(id)target key:(NSString *)key { 41 | MUDeallocTaskItem *taskItem = [MUDeallocTaskItem taskItemWithTarget:target key:key task:nil]; 42 | [self.taskSet removeObject:taskItem]; // remove task with method named 'isEqual:'. 43 | } 44 | 45 | - (void)dealloc { 46 | [_taskSet enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id _Nonnull obj, BOOL * _Nonnull stop) { 47 | MUDeallocTaskItem *item = obj; 48 | !item.task?:item.task(); // run script to clean all weak references to 'self'. 49 | }]; 50 | } 51 | 52 | - (NSMutableSet *)taskSet { 53 | if (!_taskSet) { 54 | _taskSet = [NSMutableSet set]; 55 | } 56 | return _taskSet; 57 | } 58 | 59 | @end 60 | 61 | 62 | @implementation MUDeallocTaskItem 63 | 64 | - (instancetype)initWithTarget:(id)target key:(NSString *)key task:(DeallocBlock)task { 65 | self = [super init]; 66 | if (self) { 67 | _target = target; 68 | _key = key; 69 | _task = [task copy]; 70 | } 71 | return self; 72 | } 73 | 74 | + (instancetype)taskItemWithTarget:(id)target key:(NSString *)key task:(DeallocBlock)task { 75 | return [[self alloc] initWithTarget:target key:key task:task]; 76 | } 77 | 78 | - (BOOL)isEqual:(id)object { 79 | if (object == self) { 80 | return YES; 81 | } else if (![object isKindOfClass:[self class]]) { 82 | return NO; 83 | } else { 84 | MUDeallocTaskItem *another = (MUDeallocTaskItem *)object; 85 | return [another.target isEqual:self.target] && [another.key isEqualToString:self.key]; 86 | } 87 | } 88 | 89 | /** 90 | * 瞎写一个hash来快速查找 91 | * 92 | * @return NSUInteger 93 | */ 94 | - (NSUInteger)hash { 95 | NSObject *target = self.target; 96 | return (target.hash + self.key.hash) / 2; 97 | } 98 | 99 | @end 100 | 101 | -------------------------------------------------------------------------------- /Demo-PlanStep-1/Demo-PlanStep-1.xcodeproj/xcuserdata/Unique.xcuserdatad/xcschemes/Demo-PlanStep-1.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /Demo-PlanStep-2/Demo-PlanStep-2.xcodeproj/xcuserdata/Unique.xcuserdatad/xcschemes/Demo-PlanStep-2.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /Demo-PlanStep-Release/Demo-PlanStep-Release.xcodeproj/xcuserdata/Unique.xcuserdatad/xcschemes/Demo-PlanStep-Release.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /Demo-PlanStep-1/Demo-PlanStep-1.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | D4A9E0481D5EA95C0032DF17 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D4A9E0471D5EA95C0032DF17 /* main.m */; }; 11 | D4A9E05C1D5EAC200032DF17 /* MUHostClass.m in Sources */ = {isa = PBXBuildFile; fileRef = D4A9E05B1D5EAC200032DF17 /* MUHostClass.m */; }; 12 | D4A9E05F1D5EAC6F0032DF17 /* MUValueClass.m in Sources */ = {isa = PBXBuildFile; fileRef = D4A9E05E1D5EAC6F0032DF17 /* MUValueClass.m */; }; 13 | D4A9E0651D5EAE030032DF17 /* MUHostClass+Association.m in Sources */ = {isa = PBXBuildFile; fileRef = D4A9E0641D5EAE030032DF17 /* MUHostClass+Association.m */; }; 14 | /* End PBXBuildFile section */ 15 | 16 | /* Begin PBXCopyFilesBuildPhase section */ 17 | D4A9E0421D5EA95C0032DF17 /* CopyFiles */ = { 18 | isa = PBXCopyFilesBuildPhase; 19 | buildActionMask = 2147483647; 20 | dstPath = /usr/share/man/man1/; 21 | dstSubfolderSpec = 0; 22 | files = ( 23 | ); 24 | runOnlyForDeploymentPostprocessing = 1; 25 | }; 26 | /* End PBXCopyFilesBuildPhase section */ 27 | 28 | /* Begin PBXFileReference section */ 29 | D4A9E0441D5EA95C0032DF17 /* Demo-PlanStep-1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Demo-PlanStep-1"; sourceTree = BUILT_PRODUCTS_DIR; }; 30 | D4A9E0471D5EA95C0032DF17 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 31 | D4A9E05A1D5EAC200032DF17 /* MUHostClass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MUHostClass.h; sourceTree = ""; }; 32 | D4A9E05B1D5EAC200032DF17 /* MUHostClass.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MUHostClass.m; sourceTree = ""; }; 33 | D4A9E05D1D5EAC6F0032DF17 /* MUValueClass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MUValueClass.h; sourceTree = ""; }; 34 | D4A9E05E1D5EAC6F0032DF17 /* MUValueClass.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MUValueClass.m; sourceTree = ""; }; 35 | D4A9E0631D5EAE030032DF17 /* MUHostClass+Association.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MUHostClass+Association.h"; sourceTree = ""; }; 36 | D4A9E0641D5EAE030032DF17 /* MUHostClass+Association.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MUHostClass+Association.m"; sourceTree = ""; }; 37 | /* End PBXFileReference section */ 38 | 39 | /* Begin PBXFrameworksBuildPhase section */ 40 | D4A9E0411D5EA95C0032DF17 /* Frameworks */ = { 41 | isa = PBXFrameworksBuildPhase; 42 | buildActionMask = 2147483647; 43 | files = ( 44 | ); 45 | runOnlyForDeploymentPostprocessing = 0; 46 | }; 47 | /* End PBXFrameworksBuildPhase section */ 48 | 49 | /* Begin PBXGroup section */ 50 | D4A9E03B1D5EA95C0032DF17 = { 51 | isa = PBXGroup; 52 | children = ( 53 | D4A9E0461D5EA95C0032DF17 /* Demo-PlanStep-1 */, 54 | D4A9E0451D5EA95C0032DF17 /* Products */, 55 | ); 56 | sourceTree = ""; 57 | }; 58 | D4A9E0451D5EA95C0032DF17 /* Products */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | D4A9E0441D5EA95C0032DF17 /* Demo-PlanStep-1 */, 62 | ); 63 | name = Products; 64 | sourceTree = ""; 65 | }; 66 | D4A9E0461D5EA95C0032DF17 /* Demo-PlanStep-1 */ = { 67 | isa = PBXGroup; 68 | children = ( 69 | D4A9E0471D5EA95C0032DF17 /* main.m */, 70 | D4A9E05A1D5EAC200032DF17 /* MUHostClass.h */, 71 | D4A9E05B1D5EAC200032DF17 /* MUHostClass.m */, 72 | D4A9E0631D5EAE030032DF17 /* MUHostClass+Association.h */, 73 | D4A9E0641D5EAE030032DF17 /* MUHostClass+Association.m */, 74 | D4A9E05D1D5EAC6F0032DF17 /* MUValueClass.h */, 75 | D4A9E05E1D5EAC6F0032DF17 /* MUValueClass.m */, 76 | ); 77 | path = "Demo-PlanStep-1"; 78 | sourceTree = ""; 79 | }; 80 | /* End PBXGroup section */ 81 | 82 | /* Begin PBXNativeTarget section */ 83 | D4A9E0431D5EA95C0032DF17 /* Demo-PlanStep-1 */ = { 84 | isa = PBXNativeTarget; 85 | buildConfigurationList = D4A9E04B1D5EA95C0032DF17 /* Build configuration list for PBXNativeTarget "Demo-PlanStep-1" */; 86 | buildPhases = ( 87 | D4A9E0401D5EA95C0032DF17 /* Sources */, 88 | D4A9E0411D5EA95C0032DF17 /* Frameworks */, 89 | D4A9E0421D5EA95C0032DF17 /* CopyFiles */, 90 | ); 91 | buildRules = ( 92 | ); 93 | dependencies = ( 94 | ); 95 | name = "Demo-PlanStep-1"; 96 | productName = "Demo-PlanStep-1"; 97 | productReference = D4A9E0441D5EA95C0032DF17 /* Demo-PlanStep-1 */; 98 | productType = "com.apple.product-type.tool"; 99 | }; 100 | /* End PBXNativeTarget section */ 101 | 102 | /* Begin PBXProject section */ 103 | D4A9E03C1D5EA95C0032DF17 /* Project object */ = { 104 | isa = PBXProject; 105 | attributes = { 106 | LastUpgradeCheck = 0720; 107 | ORGANIZATIONNAME = unique; 108 | TargetAttributes = { 109 | D4A9E0431D5EA95C0032DF17 = { 110 | CreatedOnToolsVersion = 7.2.1; 111 | }; 112 | }; 113 | }; 114 | buildConfigurationList = D4A9E03F1D5EA95C0032DF17 /* Build configuration list for PBXProject "Demo-PlanStep-1" */; 115 | compatibilityVersion = "Xcode 3.2"; 116 | developmentRegion = English; 117 | hasScannedForEncodings = 0; 118 | knownRegions = ( 119 | en, 120 | ); 121 | mainGroup = D4A9E03B1D5EA95C0032DF17; 122 | productRefGroup = D4A9E0451D5EA95C0032DF17 /* Products */; 123 | projectDirPath = ""; 124 | projectRoot = ""; 125 | targets = ( 126 | D4A9E0431D5EA95C0032DF17 /* Demo-PlanStep-1 */, 127 | ); 128 | }; 129 | /* End PBXProject section */ 130 | 131 | /* Begin PBXSourcesBuildPhase section */ 132 | D4A9E0401D5EA95C0032DF17 /* Sources */ = { 133 | isa = PBXSourcesBuildPhase; 134 | buildActionMask = 2147483647; 135 | files = ( 136 | D4A9E05C1D5EAC200032DF17 /* MUHostClass.m in Sources */, 137 | D4A9E05F1D5EAC6F0032DF17 /* MUValueClass.m in Sources */, 138 | D4A9E0651D5EAE030032DF17 /* MUHostClass+Association.m in Sources */, 139 | D4A9E0481D5EA95C0032DF17 /* main.m in Sources */, 140 | ); 141 | runOnlyForDeploymentPostprocessing = 0; 142 | }; 143 | /* End PBXSourcesBuildPhase section */ 144 | 145 | /* Begin XCBuildConfiguration section */ 146 | D4A9E0491D5EA95C0032DF17 /* Debug */ = { 147 | isa = XCBuildConfiguration; 148 | buildSettings = { 149 | ALWAYS_SEARCH_USER_PATHS = NO; 150 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 151 | CLANG_CXX_LIBRARY = "libc++"; 152 | CLANG_ENABLE_MODULES = YES; 153 | CLANG_ENABLE_OBJC_ARC = YES; 154 | CLANG_WARN_BOOL_CONVERSION = YES; 155 | CLANG_WARN_CONSTANT_CONVERSION = YES; 156 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 157 | CLANG_WARN_EMPTY_BODY = YES; 158 | CLANG_WARN_ENUM_CONVERSION = YES; 159 | CLANG_WARN_INT_CONVERSION = YES; 160 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 161 | CLANG_WARN_UNREACHABLE_CODE = YES; 162 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 163 | CODE_SIGN_IDENTITY = "-"; 164 | COPY_PHASE_STRIP = NO; 165 | DEBUG_INFORMATION_FORMAT = dwarf; 166 | ENABLE_STRICT_OBJC_MSGSEND = YES; 167 | ENABLE_TESTABILITY = YES; 168 | GCC_C_LANGUAGE_STANDARD = gnu99; 169 | GCC_DYNAMIC_NO_PIC = NO; 170 | GCC_NO_COMMON_BLOCKS = YES; 171 | GCC_OPTIMIZATION_LEVEL = 0; 172 | GCC_PREPROCESSOR_DEFINITIONS = ( 173 | "DEBUG=1", 174 | "$(inherited)", 175 | ); 176 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 177 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 178 | GCC_WARN_UNDECLARED_SELECTOR = YES; 179 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 180 | GCC_WARN_UNUSED_FUNCTION = YES; 181 | GCC_WARN_UNUSED_VARIABLE = YES; 182 | MACOSX_DEPLOYMENT_TARGET = 10.11; 183 | MTL_ENABLE_DEBUG_INFO = YES; 184 | ONLY_ACTIVE_ARCH = YES; 185 | SDKROOT = macosx; 186 | }; 187 | name = Debug; 188 | }; 189 | D4A9E04A1D5EA95C0032DF17 /* Release */ = { 190 | isa = XCBuildConfiguration; 191 | buildSettings = { 192 | ALWAYS_SEARCH_USER_PATHS = NO; 193 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 194 | CLANG_CXX_LIBRARY = "libc++"; 195 | CLANG_ENABLE_MODULES = YES; 196 | CLANG_ENABLE_OBJC_ARC = YES; 197 | CLANG_WARN_BOOL_CONVERSION = YES; 198 | CLANG_WARN_CONSTANT_CONVERSION = YES; 199 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 200 | CLANG_WARN_EMPTY_BODY = YES; 201 | CLANG_WARN_ENUM_CONVERSION = YES; 202 | CLANG_WARN_INT_CONVERSION = YES; 203 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 204 | CLANG_WARN_UNREACHABLE_CODE = YES; 205 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 206 | CODE_SIGN_IDENTITY = "-"; 207 | COPY_PHASE_STRIP = NO; 208 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 209 | ENABLE_NS_ASSERTIONS = NO; 210 | ENABLE_STRICT_OBJC_MSGSEND = YES; 211 | GCC_C_LANGUAGE_STANDARD = gnu99; 212 | GCC_NO_COMMON_BLOCKS = YES; 213 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 214 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 215 | GCC_WARN_UNDECLARED_SELECTOR = YES; 216 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 217 | GCC_WARN_UNUSED_FUNCTION = YES; 218 | GCC_WARN_UNUSED_VARIABLE = YES; 219 | MACOSX_DEPLOYMENT_TARGET = 10.11; 220 | MTL_ENABLE_DEBUG_INFO = NO; 221 | SDKROOT = macosx; 222 | }; 223 | name = Release; 224 | }; 225 | D4A9E04C1D5EA95C0032DF17 /* Debug */ = { 226 | isa = XCBuildConfiguration; 227 | buildSettings = { 228 | PRODUCT_NAME = "$(TARGET_NAME)"; 229 | }; 230 | name = Debug; 231 | }; 232 | D4A9E04D1D5EA95C0032DF17 /* Release */ = { 233 | isa = XCBuildConfiguration; 234 | buildSettings = { 235 | PRODUCT_NAME = "$(TARGET_NAME)"; 236 | }; 237 | name = Release; 238 | }; 239 | /* End XCBuildConfiguration section */ 240 | 241 | /* Begin XCConfigurationList section */ 242 | D4A9E03F1D5EA95C0032DF17 /* Build configuration list for PBXProject "Demo-PlanStep-1" */ = { 243 | isa = XCConfigurationList; 244 | buildConfigurations = ( 245 | D4A9E0491D5EA95C0032DF17 /* Debug */, 246 | D4A9E04A1D5EA95C0032DF17 /* Release */, 247 | ); 248 | defaultConfigurationIsVisible = 0; 249 | defaultConfigurationName = Release; 250 | }; 251 | D4A9E04B1D5EA95C0032DF17 /* Build configuration list for PBXNativeTarget "Demo-PlanStep-1" */ = { 252 | isa = XCConfigurationList; 253 | buildConfigurations = ( 254 | D4A9E04C1D5EA95C0032DF17 /* Debug */, 255 | D4A9E04D1D5EA95C0032DF17 /* Release */, 256 | ); 257 | defaultConfigurationIsVisible = 0; 258 | }; 259 | /* End XCConfigurationList section */ 260 | }; 261 | rootObject = D4A9E03C1D5EA95C0032DF17 /* Project object */; 262 | } 263 | -------------------------------------------------------------------------------- /Demo-PlanStep-Release/Demo-PlanStep-Release.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | D4E07A891D60B418006E2F90 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D4E07A881D60B418006E2F90 /* main.m */; }; 11 | D4E07A991D60B560006E2F90 /* NSObject+SubObj.m in Sources */ = {isa = PBXBuildFile; fileRef = D4E07A981D60B560006E2F90 /* NSObject+SubObj.m */; }; 12 | D4E07A9A1D60B5E1006E2F90 /* MUDeallocTask.m in Sources */ = {isa = PBXBuildFile; fileRef = D4E07A911D60B4D2006E2F90 /* MUDeallocTask.m */; }; 13 | D4E07A9B1D60B5E1006E2F90 /* NSObject+Association.m in Sources */ = {isa = PBXBuildFile; fileRef = D4E07A931D60B4D2006E2F90 /* NSObject+Association.m */; }; 14 | D4E07A9C1D60B5E1006E2F90 /* NSObject+Dealloc.m in Sources */ = {isa = PBXBuildFile; fileRef = D4E07A951D60B4D2006E2F90 /* NSObject+Dealloc.m */; }; 15 | /* End PBXBuildFile section */ 16 | 17 | /* Begin PBXCopyFilesBuildPhase section */ 18 | D4E07A831D60B418006E2F90 /* CopyFiles */ = { 19 | isa = PBXCopyFilesBuildPhase; 20 | buildActionMask = 2147483647; 21 | dstPath = /usr/share/man/man1/; 22 | dstSubfolderSpec = 0; 23 | files = ( 24 | ); 25 | runOnlyForDeploymentPostprocessing = 1; 26 | }; 27 | /* End PBXCopyFilesBuildPhase section */ 28 | 29 | /* Begin PBXFileReference section */ 30 | D4E07A851D60B418006E2F90 /* Demo-PlanStep-Release */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Demo-PlanStep-Release"; sourceTree = BUILT_PRODUCTS_DIR; }; 31 | D4E07A881D60B418006E2F90 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 32 | D4E07A901D60B4D2006E2F90 /* MUDeallocTask.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MUDeallocTask.h; sourceTree = ""; }; 33 | D4E07A911D60B4D2006E2F90 /* MUDeallocTask.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MUDeallocTask.m; sourceTree = ""; }; 34 | D4E07A921D60B4D2006E2F90 /* NSObject+Association.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSObject+Association.h"; sourceTree = ""; }; 35 | D4E07A931D60B4D2006E2F90 /* NSObject+Association.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSObject+Association.m"; sourceTree = ""; }; 36 | D4E07A941D60B4D2006E2F90 /* NSObject+Dealloc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSObject+Dealloc.h"; sourceTree = ""; }; 37 | D4E07A951D60B4D2006E2F90 /* NSObject+Dealloc.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSObject+Dealloc.m"; sourceTree = ""; }; 38 | D4E07A961D60B4F5006E2F90 /* MUAssosiation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MUAssosiation.h; sourceTree = ""; }; 39 | D4E07A971D60B560006E2F90 /* NSObject+SubObj.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+SubObj.h"; sourceTree = ""; }; 40 | D4E07A981D60B560006E2F90 /* NSObject+SubObj.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+SubObj.m"; sourceTree = ""; }; 41 | /* End PBXFileReference section */ 42 | 43 | /* Begin PBXFrameworksBuildPhase section */ 44 | D4E07A821D60B418006E2F90 /* Frameworks */ = { 45 | isa = PBXFrameworksBuildPhase; 46 | buildActionMask = 2147483647; 47 | files = ( 48 | ); 49 | runOnlyForDeploymentPostprocessing = 0; 50 | }; 51 | /* End PBXFrameworksBuildPhase section */ 52 | 53 | /* Begin PBXGroup section */ 54 | D4E07A7C1D60B418006E2F90 = { 55 | isa = PBXGroup; 56 | children = ( 57 | D4E07A8F1D60B4D2006E2F90 /* Assosiation */, 58 | D4E07A871D60B418006E2F90 /* Demo-PlanStep-Release */, 59 | D4E07A861D60B418006E2F90 /* Products */, 60 | ); 61 | sourceTree = ""; 62 | }; 63 | D4E07A861D60B418006E2F90 /* Products */ = { 64 | isa = PBXGroup; 65 | children = ( 66 | D4E07A851D60B418006E2F90 /* Demo-PlanStep-Release */, 67 | ); 68 | name = Products; 69 | sourceTree = ""; 70 | }; 71 | D4E07A871D60B418006E2F90 /* Demo-PlanStep-Release */ = { 72 | isa = PBXGroup; 73 | children = ( 74 | D4E07A881D60B418006E2F90 /* main.m */, 75 | D4E07A971D60B560006E2F90 /* NSObject+SubObj.h */, 76 | D4E07A981D60B560006E2F90 /* NSObject+SubObj.m */, 77 | ); 78 | path = "Demo-PlanStep-Release"; 79 | sourceTree = ""; 80 | }; 81 | D4E07A8F1D60B4D2006E2F90 /* Assosiation */ = { 82 | isa = PBXGroup; 83 | children = ( 84 | D4E07A961D60B4F5006E2F90 /* MUAssosiation.h */, 85 | D4E07A901D60B4D2006E2F90 /* MUDeallocTask.h */, 86 | D4E07A911D60B4D2006E2F90 /* MUDeallocTask.m */, 87 | D4E07A921D60B4D2006E2F90 /* NSObject+Association.h */, 88 | D4E07A931D60B4D2006E2F90 /* NSObject+Association.m */, 89 | D4E07A941D60B4D2006E2F90 /* NSObject+Dealloc.h */, 90 | D4E07A951D60B4D2006E2F90 /* NSObject+Dealloc.m */, 91 | ); 92 | name = Assosiation; 93 | path = ../Assosiation; 94 | sourceTree = ""; 95 | }; 96 | /* End PBXGroup section */ 97 | 98 | /* Begin PBXNativeTarget section */ 99 | D4E07A841D60B418006E2F90 /* Demo-PlanStep-Release */ = { 100 | isa = PBXNativeTarget; 101 | buildConfigurationList = D4E07A8C1D60B418006E2F90 /* Build configuration list for PBXNativeTarget "Demo-PlanStep-Release" */; 102 | buildPhases = ( 103 | D4E07A811D60B418006E2F90 /* Sources */, 104 | D4E07A821D60B418006E2F90 /* Frameworks */, 105 | D4E07A831D60B418006E2F90 /* CopyFiles */, 106 | ); 107 | buildRules = ( 108 | ); 109 | dependencies = ( 110 | ); 111 | name = "Demo-PlanStep-Release"; 112 | productName = "Demo-PlanStep-Release"; 113 | productReference = D4E07A851D60B418006E2F90 /* Demo-PlanStep-Release */; 114 | productType = "com.apple.product-type.tool"; 115 | }; 116 | /* End PBXNativeTarget section */ 117 | 118 | /* Begin PBXProject section */ 119 | D4E07A7D1D60B418006E2F90 /* Project object */ = { 120 | isa = PBXProject; 121 | attributes = { 122 | LastUpgradeCheck = 0720; 123 | ORGANIZATIONNAME = unique; 124 | TargetAttributes = { 125 | D4E07A841D60B418006E2F90 = { 126 | CreatedOnToolsVersion = 7.2.1; 127 | }; 128 | }; 129 | }; 130 | buildConfigurationList = D4E07A801D60B418006E2F90 /* Build configuration list for PBXProject "Demo-PlanStep-Release" */; 131 | compatibilityVersion = "Xcode 3.2"; 132 | developmentRegion = English; 133 | hasScannedForEncodings = 0; 134 | knownRegions = ( 135 | en, 136 | ); 137 | mainGroup = D4E07A7C1D60B418006E2F90; 138 | productRefGroup = D4E07A861D60B418006E2F90 /* Products */; 139 | projectDirPath = ""; 140 | projectRoot = ""; 141 | targets = ( 142 | D4E07A841D60B418006E2F90 /* Demo-PlanStep-Release */, 143 | ); 144 | }; 145 | /* End PBXProject section */ 146 | 147 | /* Begin PBXSourcesBuildPhase section */ 148 | D4E07A811D60B418006E2F90 /* Sources */ = { 149 | isa = PBXSourcesBuildPhase; 150 | buildActionMask = 2147483647; 151 | files = ( 152 | D4E07A9A1D60B5E1006E2F90 /* MUDeallocTask.m in Sources */, 153 | D4E07A9B1D60B5E1006E2F90 /* NSObject+Association.m in Sources */, 154 | D4E07A9C1D60B5E1006E2F90 /* NSObject+Dealloc.m in Sources */, 155 | D4E07A991D60B560006E2F90 /* NSObject+SubObj.m in Sources */, 156 | D4E07A891D60B418006E2F90 /* main.m in Sources */, 157 | ); 158 | runOnlyForDeploymentPostprocessing = 0; 159 | }; 160 | /* End PBXSourcesBuildPhase section */ 161 | 162 | /* Begin XCBuildConfiguration section */ 163 | D4E07A8A1D60B418006E2F90 /* Debug */ = { 164 | isa = XCBuildConfiguration; 165 | buildSettings = { 166 | ALWAYS_SEARCH_USER_PATHS = NO; 167 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 168 | CLANG_CXX_LIBRARY = "libc++"; 169 | CLANG_ENABLE_MODULES = YES; 170 | CLANG_ENABLE_OBJC_ARC = YES; 171 | CLANG_WARN_BOOL_CONVERSION = YES; 172 | CLANG_WARN_CONSTANT_CONVERSION = YES; 173 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 174 | CLANG_WARN_EMPTY_BODY = YES; 175 | CLANG_WARN_ENUM_CONVERSION = YES; 176 | CLANG_WARN_INT_CONVERSION = YES; 177 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 178 | CLANG_WARN_UNREACHABLE_CODE = YES; 179 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 180 | CODE_SIGN_IDENTITY = "-"; 181 | COPY_PHASE_STRIP = NO; 182 | DEBUG_INFORMATION_FORMAT = dwarf; 183 | ENABLE_STRICT_OBJC_MSGSEND = YES; 184 | ENABLE_TESTABILITY = YES; 185 | GCC_C_LANGUAGE_STANDARD = gnu99; 186 | GCC_DYNAMIC_NO_PIC = NO; 187 | GCC_NO_COMMON_BLOCKS = YES; 188 | GCC_OPTIMIZATION_LEVEL = 0; 189 | GCC_PREPROCESSOR_DEFINITIONS = ( 190 | "DEBUG=1", 191 | "$(inherited)", 192 | ); 193 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 194 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 195 | GCC_WARN_UNDECLARED_SELECTOR = YES; 196 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 197 | GCC_WARN_UNUSED_FUNCTION = YES; 198 | GCC_WARN_UNUSED_VARIABLE = YES; 199 | MACOSX_DEPLOYMENT_TARGET = 10.11; 200 | MTL_ENABLE_DEBUG_INFO = YES; 201 | ONLY_ACTIVE_ARCH = YES; 202 | SDKROOT = macosx; 203 | }; 204 | name = Debug; 205 | }; 206 | D4E07A8B1D60B418006E2F90 /* Release */ = { 207 | isa = XCBuildConfiguration; 208 | buildSettings = { 209 | ALWAYS_SEARCH_USER_PATHS = NO; 210 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 211 | CLANG_CXX_LIBRARY = "libc++"; 212 | CLANG_ENABLE_MODULES = YES; 213 | CLANG_ENABLE_OBJC_ARC = YES; 214 | CLANG_WARN_BOOL_CONVERSION = YES; 215 | CLANG_WARN_CONSTANT_CONVERSION = YES; 216 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 217 | CLANG_WARN_EMPTY_BODY = YES; 218 | CLANG_WARN_ENUM_CONVERSION = YES; 219 | CLANG_WARN_INT_CONVERSION = YES; 220 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 221 | CLANG_WARN_UNREACHABLE_CODE = YES; 222 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 223 | CODE_SIGN_IDENTITY = "-"; 224 | COPY_PHASE_STRIP = NO; 225 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 226 | ENABLE_NS_ASSERTIONS = NO; 227 | ENABLE_STRICT_OBJC_MSGSEND = YES; 228 | GCC_C_LANGUAGE_STANDARD = gnu99; 229 | GCC_NO_COMMON_BLOCKS = YES; 230 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 231 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 232 | GCC_WARN_UNDECLARED_SELECTOR = YES; 233 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 234 | GCC_WARN_UNUSED_FUNCTION = YES; 235 | GCC_WARN_UNUSED_VARIABLE = YES; 236 | MACOSX_DEPLOYMENT_TARGET = 10.11; 237 | MTL_ENABLE_DEBUG_INFO = NO; 238 | SDKROOT = macosx; 239 | }; 240 | name = Release; 241 | }; 242 | D4E07A8D1D60B418006E2F90 /* Debug */ = { 243 | isa = XCBuildConfiguration; 244 | buildSettings = { 245 | PRODUCT_NAME = "$(TARGET_NAME)"; 246 | }; 247 | name = Debug; 248 | }; 249 | D4E07A8E1D60B418006E2F90 /* Release */ = { 250 | isa = XCBuildConfiguration; 251 | buildSettings = { 252 | PRODUCT_NAME = "$(TARGET_NAME)"; 253 | }; 254 | name = Release; 255 | }; 256 | /* End XCBuildConfiguration section */ 257 | 258 | /* Begin XCConfigurationList section */ 259 | D4E07A801D60B418006E2F90 /* Build configuration list for PBXProject "Demo-PlanStep-Release" */ = { 260 | isa = XCConfigurationList; 261 | buildConfigurations = ( 262 | D4E07A8A1D60B418006E2F90 /* Debug */, 263 | D4E07A8B1D60B418006E2F90 /* Release */, 264 | ); 265 | defaultConfigurationIsVisible = 0; 266 | defaultConfigurationName = Release; 267 | }; 268 | D4E07A8C1D60B418006E2F90 /* Build configuration list for PBXNativeTarget "Demo-PlanStep-Release" */ = { 269 | isa = XCConfigurationList; 270 | buildConfigurations = ( 271 | D4E07A8D1D60B418006E2F90 /* Debug */, 272 | D4E07A8E1D60B418006E2F90 /* Release */, 273 | ); 274 | defaultConfigurationIsVisible = 0; 275 | }; 276 | /* End XCConfigurationList section */ 277 | }; 278 | rootObject = D4E07A7D1D60B418006E2F90 /* Project object */; 279 | } 280 | -------------------------------------------------------------------------------- /Demo-PlanStep-2/Demo-PlanStep-2.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | D4A9E0731D5EB0B40032DF17 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D4A9E0721D5EB0B40032DF17 /* main.m */; }; 11 | D4A9E07B1D5EB0C40032DF17 /* MUHostClass.m in Sources */ = {isa = PBXBuildFile; fileRef = D4A9E07A1D5EB0C40032DF17 /* MUHostClass.m */; }; 12 | D4A9E07E1D5EB0DA0032DF17 /* MUValueClass.m in Sources */ = {isa = PBXBuildFile; fileRef = D4A9E07D1D5EB0DA0032DF17 /* MUValueClass.m */; }; 13 | D4A9E0811D5EB0ED0032DF17 /* MUHostClass+Association.m in Sources */ = {isa = PBXBuildFile; fileRef = D4A9E0801D5EB0ED0032DF17 /* MUHostClass+Association.m */; }; 14 | D4A9E0841D5EB1020032DF17 /* NSObject+MUWeakTask.m in Sources */ = {isa = PBXBuildFile; fileRef = D4A9E0831D5EB1020032DF17 /* NSObject+MUWeakTask.m */; }; 15 | D4A9E0871D5EB1160032DF17 /* MUWeakTask.m in Sources */ = {isa = PBXBuildFile; fileRef = D4A9E0861D5EB1160032DF17 /* MUWeakTask.m */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXCopyFilesBuildPhase section */ 19 | D4A9E06D1D5EB0B40032DF17 /* CopyFiles */ = { 20 | isa = PBXCopyFilesBuildPhase; 21 | buildActionMask = 2147483647; 22 | dstPath = /usr/share/man/man1/; 23 | dstSubfolderSpec = 0; 24 | files = ( 25 | ); 26 | runOnlyForDeploymentPostprocessing = 1; 27 | }; 28 | /* End PBXCopyFilesBuildPhase section */ 29 | 30 | /* Begin PBXFileReference section */ 31 | D4A9E06F1D5EB0B40032DF17 /* Demo-PlanStep-2 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Demo-PlanStep-2"; sourceTree = BUILT_PRODUCTS_DIR; }; 32 | D4A9E0721D5EB0B40032DF17 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 33 | D4A9E0791D5EB0C40032DF17 /* MUHostClass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MUHostClass.h; sourceTree = ""; }; 34 | D4A9E07A1D5EB0C40032DF17 /* MUHostClass.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MUHostClass.m; sourceTree = ""; }; 35 | D4A9E07C1D5EB0DA0032DF17 /* MUValueClass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MUValueClass.h; sourceTree = ""; }; 36 | D4A9E07D1D5EB0DA0032DF17 /* MUValueClass.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MUValueClass.m; sourceTree = ""; }; 37 | D4A9E07F1D5EB0ED0032DF17 /* MUHostClass+Association.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MUHostClass+Association.h"; sourceTree = ""; }; 38 | D4A9E0801D5EB0ED0032DF17 /* MUHostClass+Association.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MUHostClass+Association.m"; sourceTree = ""; }; 39 | D4A9E0821D5EB1020032DF17 /* NSObject+MUWeakTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+MUWeakTask.h"; sourceTree = ""; }; 40 | D4A9E0831D5EB1020032DF17 /* NSObject+MUWeakTask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+MUWeakTask.m"; sourceTree = ""; }; 41 | D4A9E0851D5EB1160032DF17 /* MUWeakTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MUWeakTask.h; sourceTree = ""; }; 42 | D4A9E0861D5EB1160032DF17 /* MUWeakTask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MUWeakTask.m; sourceTree = ""; }; 43 | /* End PBXFileReference section */ 44 | 45 | /* Begin PBXFrameworksBuildPhase section */ 46 | D4A9E06C1D5EB0B40032DF17 /* Frameworks */ = { 47 | isa = PBXFrameworksBuildPhase; 48 | buildActionMask = 2147483647; 49 | files = ( 50 | ); 51 | runOnlyForDeploymentPostprocessing = 0; 52 | }; 53 | /* End PBXFrameworksBuildPhase section */ 54 | 55 | /* Begin PBXGroup section */ 56 | D4A9E0661D5EB0B40032DF17 = { 57 | isa = PBXGroup; 58 | children = ( 59 | D4A9E0711D5EB0B40032DF17 /* Demo-PlanStep-2 */, 60 | D4A9E0701D5EB0B40032DF17 /* Products */, 61 | ); 62 | sourceTree = ""; 63 | }; 64 | D4A9E0701D5EB0B40032DF17 /* Products */ = { 65 | isa = PBXGroup; 66 | children = ( 67 | D4A9E06F1D5EB0B40032DF17 /* Demo-PlanStep-2 */, 68 | ); 69 | name = Products; 70 | sourceTree = ""; 71 | }; 72 | D4A9E0711D5EB0B40032DF17 /* Demo-PlanStep-2 */ = { 73 | isa = PBXGroup; 74 | children = ( 75 | D4A9E0721D5EB0B40032DF17 /* main.m */, 76 | D4A9E0791D5EB0C40032DF17 /* MUHostClass.h */, 77 | D4A9E07A1D5EB0C40032DF17 /* MUHostClass.m */, 78 | D4A9E07C1D5EB0DA0032DF17 /* MUValueClass.h */, 79 | D4A9E07D1D5EB0DA0032DF17 /* MUValueClass.m */, 80 | D4A9E07F1D5EB0ED0032DF17 /* MUHostClass+Association.h */, 81 | D4A9E0801D5EB0ED0032DF17 /* MUHostClass+Association.m */, 82 | D4A9E0821D5EB1020032DF17 /* NSObject+MUWeakTask.h */, 83 | D4A9E0831D5EB1020032DF17 /* NSObject+MUWeakTask.m */, 84 | D4A9E0851D5EB1160032DF17 /* MUWeakTask.h */, 85 | D4A9E0861D5EB1160032DF17 /* MUWeakTask.m */, 86 | ); 87 | path = "Demo-PlanStep-2"; 88 | sourceTree = ""; 89 | }; 90 | /* End PBXGroup section */ 91 | 92 | /* Begin PBXNativeTarget section */ 93 | D4A9E06E1D5EB0B40032DF17 /* Demo-PlanStep-2 */ = { 94 | isa = PBXNativeTarget; 95 | buildConfigurationList = D4A9E0761D5EB0B40032DF17 /* Build configuration list for PBXNativeTarget "Demo-PlanStep-2" */; 96 | buildPhases = ( 97 | D4A9E06B1D5EB0B40032DF17 /* Sources */, 98 | D4A9E06C1D5EB0B40032DF17 /* Frameworks */, 99 | D4A9E06D1D5EB0B40032DF17 /* CopyFiles */, 100 | ); 101 | buildRules = ( 102 | ); 103 | dependencies = ( 104 | ); 105 | name = "Demo-PlanStep-2"; 106 | productName = "Demo-PlanStep-2"; 107 | productReference = D4A9E06F1D5EB0B40032DF17 /* Demo-PlanStep-2 */; 108 | productType = "com.apple.product-type.tool"; 109 | }; 110 | /* End PBXNativeTarget section */ 111 | 112 | /* Begin PBXProject section */ 113 | D4A9E0671D5EB0B40032DF17 /* Project object */ = { 114 | isa = PBXProject; 115 | attributes = { 116 | LastUpgradeCheck = 0720; 117 | ORGANIZATIONNAME = unique; 118 | TargetAttributes = { 119 | D4A9E06E1D5EB0B40032DF17 = { 120 | CreatedOnToolsVersion = 7.2.1; 121 | }; 122 | }; 123 | }; 124 | buildConfigurationList = D4A9E06A1D5EB0B40032DF17 /* Build configuration list for PBXProject "Demo-PlanStep-2" */; 125 | compatibilityVersion = "Xcode 3.2"; 126 | developmentRegion = English; 127 | hasScannedForEncodings = 0; 128 | knownRegions = ( 129 | en, 130 | ); 131 | mainGroup = D4A9E0661D5EB0B40032DF17; 132 | productRefGroup = D4A9E0701D5EB0B40032DF17 /* Products */; 133 | projectDirPath = ""; 134 | projectRoot = ""; 135 | targets = ( 136 | D4A9E06E1D5EB0B40032DF17 /* Demo-PlanStep-2 */, 137 | ); 138 | }; 139 | /* End PBXProject section */ 140 | 141 | /* Begin PBXSourcesBuildPhase section */ 142 | D4A9E06B1D5EB0B40032DF17 /* Sources */ = { 143 | isa = PBXSourcesBuildPhase; 144 | buildActionMask = 2147483647; 145 | files = ( 146 | D4A9E0871D5EB1160032DF17 /* MUWeakTask.m in Sources */, 147 | D4A9E07B1D5EB0C40032DF17 /* MUHostClass.m in Sources */, 148 | D4A9E07E1D5EB0DA0032DF17 /* MUValueClass.m in Sources */, 149 | D4A9E0841D5EB1020032DF17 /* NSObject+MUWeakTask.m in Sources */, 150 | D4A9E0811D5EB0ED0032DF17 /* MUHostClass+Association.m in Sources */, 151 | D4A9E0731D5EB0B40032DF17 /* main.m in Sources */, 152 | ); 153 | runOnlyForDeploymentPostprocessing = 0; 154 | }; 155 | /* End PBXSourcesBuildPhase section */ 156 | 157 | /* Begin XCBuildConfiguration section */ 158 | D4A9E0741D5EB0B40032DF17 /* Debug */ = { 159 | isa = XCBuildConfiguration; 160 | buildSettings = { 161 | ALWAYS_SEARCH_USER_PATHS = NO; 162 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 163 | CLANG_CXX_LIBRARY = "libc++"; 164 | CLANG_ENABLE_MODULES = YES; 165 | CLANG_ENABLE_OBJC_ARC = YES; 166 | CLANG_WARN_BOOL_CONVERSION = YES; 167 | CLANG_WARN_CONSTANT_CONVERSION = YES; 168 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 169 | CLANG_WARN_EMPTY_BODY = YES; 170 | CLANG_WARN_ENUM_CONVERSION = YES; 171 | CLANG_WARN_INT_CONVERSION = YES; 172 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 173 | CLANG_WARN_UNREACHABLE_CODE = YES; 174 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 175 | CODE_SIGN_IDENTITY = "-"; 176 | COPY_PHASE_STRIP = NO; 177 | DEBUG_INFORMATION_FORMAT = dwarf; 178 | ENABLE_STRICT_OBJC_MSGSEND = YES; 179 | ENABLE_TESTABILITY = YES; 180 | GCC_C_LANGUAGE_STANDARD = gnu99; 181 | GCC_DYNAMIC_NO_PIC = NO; 182 | GCC_NO_COMMON_BLOCKS = YES; 183 | GCC_OPTIMIZATION_LEVEL = 0; 184 | GCC_PREPROCESSOR_DEFINITIONS = ( 185 | "DEBUG=1", 186 | "$(inherited)", 187 | ); 188 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 189 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 190 | GCC_WARN_UNDECLARED_SELECTOR = YES; 191 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 192 | GCC_WARN_UNUSED_FUNCTION = YES; 193 | GCC_WARN_UNUSED_VARIABLE = YES; 194 | MACOSX_DEPLOYMENT_TARGET = 10.11; 195 | MTL_ENABLE_DEBUG_INFO = YES; 196 | ONLY_ACTIVE_ARCH = YES; 197 | SDKROOT = macosx; 198 | }; 199 | name = Debug; 200 | }; 201 | D4A9E0751D5EB0B40032DF17 /* Release */ = { 202 | isa = XCBuildConfiguration; 203 | buildSettings = { 204 | ALWAYS_SEARCH_USER_PATHS = NO; 205 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 206 | CLANG_CXX_LIBRARY = "libc++"; 207 | CLANG_ENABLE_MODULES = YES; 208 | CLANG_ENABLE_OBJC_ARC = YES; 209 | CLANG_WARN_BOOL_CONVERSION = YES; 210 | CLANG_WARN_CONSTANT_CONVERSION = YES; 211 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 212 | CLANG_WARN_EMPTY_BODY = YES; 213 | CLANG_WARN_ENUM_CONVERSION = YES; 214 | CLANG_WARN_INT_CONVERSION = YES; 215 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 216 | CLANG_WARN_UNREACHABLE_CODE = YES; 217 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 218 | CODE_SIGN_IDENTITY = "-"; 219 | COPY_PHASE_STRIP = NO; 220 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 221 | ENABLE_NS_ASSERTIONS = NO; 222 | ENABLE_STRICT_OBJC_MSGSEND = YES; 223 | GCC_C_LANGUAGE_STANDARD = gnu99; 224 | GCC_NO_COMMON_BLOCKS = YES; 225 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 226 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 227 | GCC_WARN_UNDECLARED_SELECTOR = YES; 228 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 229 | GCC_WARN_UNUSED_FUNCTION = YES; 230 | GCC_WARN_UNUSED_VARIABLE = YES; 231 | MACOSX_DEPLOYMENT_TARGET = 10.11; 232 | MTL_ENABLE_DEBUG_INFO = NO; 233 | SDKROOT = macosx; 234 | }; 235 | name = Release; 236 | }; 237 | D4A9E0771D5EB0B40032DF17 /* Debug */ = { 238 | isa = XCBuildConfiguration; 239 | buildSettings = { 240 | PRODUCT_NAME = "$(TARGET_NAME)"; 241 | }; 242 | name = Debug; 243 | }; 244 | D4A9E0781D5EB0B40032DF17 /* Release */ = { 245 | isa = XCBuildConfiguration; 246 | buildSettings = { 247 | PRODUCT_NAME = "$(TARGET_NAME)"; 248 | }; 249 | name = Release; 250 | }; 251 | /* End XCBuildConfiguration section */ 252 | 253 | /* Begin XCConfigurationList section */ 254 | D4A9E06A1D5EB0B40032DF17 /* Build configuration list for PBXProject "Demo-PlanStep-2" */ = { 255 | isa = XCConfigurationList; 256 | buildConfigurations = ( 257 | D4A9E0741D5EB0B40032DF17 /* Debug */, 258 | D4A9E0751D5EB0B40032DF17 /* Release */, 259 | ); 260 | defaultConfigurationIsVisible = 0; 261 | defaultConfigurationName = Release; 262 | }; 263 | D4A9E0761D5EB0B40032DF17 /* Build configuration list for PBXNativeTarget "Demo-PlanStep-2" */ = { 264 | isa = XCConfigurationList; 265 | buildConfigurations = ( 266 | D4A9E0771D5EB0B40032DF17 /* Debug */, 267 | D4A9E0781D5EB0B40032DF17 /* Release */, 268 | ); 269 | defaultConfigurationIsVisible = 0; 270 | }; 271 | /* End XCConfigurationList section */ 272 | }; 273 | rootObject = D4A9E0671D5EB0B40032DF17 /* Project object */; 274 | } 275 | --------------------------------------------------------------------------------