├── 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 |
--------------------------------------------------------------------------------