├── MemoryConsumer
├── en.lproj
│ └── InfoPlist.strings
├── MemoryConsumerViewController.h
├── MemoryConsumerAppDelegate.h
├── MemoryConsumer-Prefix.pch
├── main.m
├── Images.xcassets
│ ├── AppIcon.appiconset
│ │ └── Contents.json
│ └── LaunchImage.launchimage
│ │ └── Contents.json
├── MemoryConsumer-Info.plist
├── MemoryConsumerViewController.m
├── MemoryConsumerAppDelegate.m
└── Base.lproj
│ └── Main.storyboard
├── MemoryConsumerTests
├── en.lproj
│ └── InfoPlist.strings
├── MemoryConsumerTests-Info.plist
└── MemoryConsumerTests.m
├── MemoryConsumer.xcodeproj
├── project.xcworkspace
│ └── contents.xcworkspacedata
├── xcuserdata
│ └── keijiro.xcuserdatad
│ │ └── xcschemes
│ │ ├── xcschememanagement.plist
│ │ └── MemoryConsumer.xcscheme
└── project.pbxproj
└── README.md
/MemoryConsumer/en.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* Localized versions of Info.plist keys */
2 |
3 |
--------------------------------------------------------------------------------
/MemoryConsumerTests/en.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* Localized versions of Info.plist keys */
2 |
3 |
--------------------------------------------------------------------------------
/MemoryConsumer.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/MemoryConsumer/MemoryConsumerViewController.h:
--------------------------------------------------------------------------------
1 | //
2 | // MemoryConsumerViewController.h
3 | // MemoryConsumer
4 | //
5 | // Created by Takahashi Keijiro on 10/23/13.
6 | // Copyright (c) 2013 Radium Software. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface MemoryConsumerViewController : UIViewController
12 | {
13 | void *_pointerArray[1024 * 1024];
14 | }
15 | @end
16 |
--------------------------------------------------------------------------------
/MemoryConsumer/MemoryConsumerAppDelegate.h:
--------------------------------------------------------------------------------
1 | //
2 | // MemoryConsumerAppDelegate.h
3 | // MemoryConsumer
4 | //
5 | // Created by Takahashi Keijiro on 10/23/13.
6 | // Copyright (c) 2013 Radium Software. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface MemoryConsumerAppDelegate : UIResponder
12 |
13 | @property (strong, nonatomic) UIWindow *window;
14 |
15 | @end
16 |
--------------------------------------------------------------------------------
/MemoryConsumer/MemoryConsumer-Prefix.pch:
--------------------------------------------------------------------------------
1 | //
2 | // Prefix header
3 | //
4 | // The contents of this file are implicitly included at the beginning of every source file.
5 | //
6 |
7 | #import
8 |
9 | #ifndef __IPHONE_5_0
10 | #warning "This project uses features only available in iOS SDK 5.0 and later."
11 | #endif
12 |
13 | #ifdef __OBJC__
14 | #import
15 | #import
16 | #endif
17 |
--------------------------------------------------------------------------------
/MemoryConsumer/main.m:
--------------------------------------------------------------------------------
1 | //
2 | // main.m
3 | // MemoryConsumer
4 | //
5 | // Created by Takahashi Keijiro on 10/23/13.
6 | // Copyright (c) 2013 Radium Software. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | #import "MemoryConsumerAppDelegate.h"
12 |
13 | int main(int argc, char * argv[])
14 | {
15 | @autoreleasepool {
16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([MemoryConsumerAppDelegate class]));
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/MemoryConsumer/Images.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "29x29",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "40x40",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "60x60",
16 | "scale" : "2x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
--------------------------------------------------------------------------------
/MemoryConsumer/Images.xcassets/LaunchImage.launchimage/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "orientation" : "portrait",
5 | "idiom" : "iphone",
6 | "extent" : "full-screen",
7 | "minimum-system-version" : "7.0",
8 | "scale" : "2x"
9 | },
10 | {
11 | "orientation" : "portrait",
12 | "idiom" : "iphone",
13 | "subtype" : "retina4",
14 | "extent" : "full-screen",
15 | "minimum-system-version" : "7.0",
16 | "scale" : "2x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
--------------------------------------------------------------------------------
/MemoryConsumer.xcodeproj/xcuserdata/keijiro.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | MemoryConsumer.xcscheme
8 |
9 | orderHint
10 | 0
11 |
12 |
13 | SuppressBuildableAutocreation
14 |
15 | 0FDEAAAA1817DF71002A1843
16 |
17 | primary
18 |
19 |
20 | 0FDEAACB1817DF71002A1843
21 |
22 | primary
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/MemoryConsumerTests/MemoryConsumerTests-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIdentifier
10 | jp.radiumsoftware.${PRODUCT_NAME:rfc1034identifier}
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundlePackageType
14 | BNDL
15 | CFBundleShortVersionString
16 | 1.0
17 | CFBundleSignature
18 | ????
19 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/MemoryConsumerTests/MemoryConsumerTests.m:
--------------------------------------------------------------------------------
1 | //
2 | // MemoryConsumerTests.m
3 | // MemoryConsumerTests
4 | //
5 | // Created by Takahashi Keijiro on 10/23/13.
6 | // Copyright (c) 2013 Radium Software. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface MemoryConsumerTests : XCTestCase
12 |
13 | @end
14 |
15 | @implementation MemoryConsumerTests
16 |
17 | - (void)setUp
18 | {
19 | [super setUp];
20 | // Put setup code here. This method is called before the invocation of each test method in the class.
21 | }
22 |
23 | - (void)tearDown
24 | {
25 | // Put teardown code here. This method is called after the invocation of each test method in the class.
26 | [super tearDown];
27 | }
28 |
29 | - (void)testExample
30 | {
31 | XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__);
32 | }
33 |
34 | @end
35 |
--------------------------------------------------------------------------------
/MemoryConsumer/MemoryConsumer-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleDisplayName
8 | ${PRODUCT_NAME}
9 | CFBundleExecutable
10 | ${EXECUTABLE_NAME}
11 | CFBundleIdentifier
12 | jp.radiumsoftware.${PRODUCT_NAME:rfc1034identifier}
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | ${PRODUCT_NAME}
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleSignature
22 | ????
23 | CFBundleVersion
24 | 1.0
25 | LSRequiresIPhoneOS
26 |
27 | UIMainStoryboardFile
28 | Main
29 | UIRequiredDeviceCapabilities
30 |
31 | armv7
32 |
33 | UISupportedInterfaceOrientations
34 |
35 | UIInterfaceOrientationPortrait
36 | UIInterfaceOrientationLandscapeLeft
37 | UIInterfaceOrientationLandscapeRight
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/MemoryConsumer/MemoryConsumerViewController.m:
--------------------------------------------------------------------------------
1 | //
2 | // MemoryConsumerViewController.m
3 | // MemoryConsumer
4 | //
5 | // Created by Takahashi Keijiro on 10/23/13.
6 | // Copyright (c) 2013 Radium Software. All rights reserved.
7 | //
8 |
9 | #import "MemoryConsumerViewController.h"
10 |
11 | static void *AllocateDirtyBlock(NSUInteger size)
12 | {
13 | Byte *block = malloc(size);
14 | for (NSUInteger offset = 0; offset < size; offset++) {
15 | block[offset] = offset & 0xff;
16 | }
17 | return block;
18 | }
19 |
20 | @interface MemoryConsumerViewController ()
21 |
22 | @end
23 |
24 | @implementation MemoryConsumerViewController
25 |
26 | - (void)viewDidLoad
27 | {
28 | [super viewDidLoad];
29 | // Do any additional setup after loading the view, typically from a nib.
30 | }
31 |
32 | - (void)didReceiveMemoryWarning
33 | {
34 | [super didReceiveMemoryWarning];
35 | // Dispose of any resources that can be recreated.
36 | }
37 |
38 | - (IBAction)allocateSmallMemoryBlocks:(id)sender {
39 | for (int i = 0; i < 1024 * 1024; i++) {
40 | if (_pointerArray[i] == NULL) {
41 | _pointerArray[i] = AllocateDirtyBlock(8);
42 | }
43 | }
44 | }
45 |
46 | - (IBAction)allocateLargeMemoryBlocks:(id)sender {
47 | for (int i = 0; i < 64; i++) {
48 | if (_pointerArray[i] == NULL) {
49 | _pointerArray[i] = AllocateDirtyBlock(256 * 1024);
50 | }
51 | }
52 | }
53 |
54 | - (IBAction)freeAll:(id)sender {
55 | for (int i = 0; i < 1024 * 1024; i++) {
56 | if (_pointerArray[i] != NULL) {
57 | free(_pointerArray[i]);
58 | _pointerArray[i] = NULL;
59 | }
60 | }
61 | }
62 |
63 | @end
64 |
--------------------------------------------------------------------------------
/MemoryConsumer/MemoryConsumerAppDelegate.m:
--------------------------------------------------------------------------------
1 | //
2 | // MemoryConsumerAppDelegate.m
3 | // MemoryConsumer
4 | //
5 | // Created by Takahashi Keijiro on 10/23/13.
6 | // Copyright (c) 2013 Radium Software. All rights reserved.
7 | //
8 |
9 | #import "MemoryConsumerAppDelegate.h"
10 |
11 | @implementation MemoryConsumerAppDelegate
12 |
13 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
14 | {
15 | // Override point for customization after application launch.
16 | return YES;
17 | }
18 |
19 | - (void)applicationWillResignActive:(UIApplication *)application
20 | {
21 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
22 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
23 | }
24 |
25 | - (void)applicationDidEnterBackground:(UIApplication *)application
26 | {
27 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
28 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
29 | }
30 |
31 | - (void)applicationWillEnterForeground:(UIApplication *)application
32 | {
33 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
34 | }
35 |
36 | - (void)applicationDidBecomeActive:(UIApplication *)application
37 | {
38 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
39 | }
40 |
41 | - (void)applicationWillTerminate:(UIApplication *)application
42 | {
43 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
44 | }
45 |
46 | @end
47 |
--------------------------------------------------------------------------------
/MemoryConsumer.xcodeproj/xcuserdata/keijiro.xcuserdatad/xcschemes/MemoryConsumer.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
33 |
39 |
40 |
41 |
42 |
43 |
49 |
50 |
51 |
52 |
61 |
62 |
68 |
69 |
70 |
71 |
72 |
73 |
79 |
80 |
86 |
87 |
88 |
89 |
91 |
92 |
95 |
96 |
97 |
--------------------------------------------------------------------------------
/MemoryConsumer/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
29 |
39 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # iOS における malloc の挙動について
2 |
3 | この文書は、iOS において malloc / free を使用した場合の、メモリ消費のあり方について考察するものです。いわば、古き良き libc 経由でのメモリ管理のアプローチについて触れるものであり、Cocoa 経由でのメモリ管理についてはまた異なったアプローチがあるので注意してください。
4 |
5 | ## メモリ消費量の不可解な変動
6 |
7 | iOS アプリ開発の現場においては、度々、メモリ消費量のことが話題にあげられます。しかし、アプリの「メモリ消費量」を正確に測定することは簡単ではありません。何をもって「メモリ消費量」とするか、その定義が明らかでないためです。
8 |
9 | 「メモリ消費量」を表す数値としてよく参考に挙げられるのが、Activity Monitor で取得できる "Real Memory Usage" の値や、[task_basic_info.resident_size](http://stackoverflow.com/questions/787160/programmatically-retrieve-memory-usage-on-iphone) の値です。
10 |
11 | 
12 |
13 | ただ、これらの値は若干不可解な動きをすることがあります。malloc でメモリを確保すると、これらの値が上がっていくのはもちろんのことですが、free によってメモリを返却しても、これらの値が下がらないことがあるのです。
14 |
15 | ## テストプログラム
16 |
17 | この挙動を詳しく観察するために、簡単なテストプログラムを作成しました(このリポジトリに含まれている Xcode プロジェクトです)。
18 |
19 | 
20 |
21 | このテストプログラムには3つのボタンがあります。
22 |
23 | - 大きなメモリブロックを確保する。
24 | - 小さなメモリブロックを大量に確保する。
25 | - メモリブロックを解放する。
26 |
27 | 「大きなメモリブロックを確保する」ボタンは、次のような処理で 16MB のメモリを確保します。
28 |
29 | for (int i = 0; i < 64; i++) {
30 | _pointerArray[i] = AllocateDirtyBlock(256 * 1024);
31 | }
32 |
33 | 「小さなメモリブロックを確保する」ボタンは、次のような処理で 8MB のメモリを確保します。
34 |
35 | for (int i = 0; i < 1024 * 1024; i++) {
36 | _pointerArray[i] = AllocateDirtyBlock(8);
37 | }
38 |
39 | これらのボタンを押したときに生じる挙動を観察してみます。
40 |
41 | ### 大きなメモリブロックの場合
42 |
43 | 初期状態では 7MB 程度であったのが、ボタンを押すと 23MB にまで増えました。解放ボタンを押すと 11MB にまで減りました。
44 |
45 | 
46 |
47 | 完全に元には戻らないのが若干不思議ですが、分かりやすい結果と言えます。
48 |
49 | ### 小さなメモリブロックの場合
50 |
51 | 初期状態では 7MB 程度であったのが、ボタンを押すと 26MB にまで増えました。解放ボタンを押しても値は減少しません。
52 |
53 | 
54 |
55 | この後、ホームボタンを押してアプリを中断し、Facebook, Twitter, Safari, Gmail 等、適度にメモリを消費するアプリを立ち上げていったところ、Real Mem は 11MB まで減りました。
56 |
57 | 
58 |
59 | ## なぜ違いが出るのか
60 |
61 | iOS は malloc 経由で確保されるメモリを **tiny**, **small**, **large** の3つ1の **zone** に分類して管理します。このうち large zone は、領域が解放されると即座に物理メモリをシステムに返却します。他の2つは、メモリプレッシャーが生じるまで解放しない傾向にあります。そのため、上のような挙動の違いが生じます。
62 |
63 | これらの挙動の違いは、VM Tracker を使用することで、より詳しく観察できます。
64 |
65 | > 1 過去の資料には "huge" という 4 つ目の zone が存在すると記されている場合もありますが、これは [magazine allocator](http://www.opensource.apple.com/source/Libc/Libc-825.40.1/gen/magazine_malloc.c) への移行の際に廃止されています。恐らく現状の iOS でも使用されていないでしょう。
66 |
67 | ## VM Tracker で詳しく観察する
68 |
69 | Instruments の Activity Monitor テンプレートはシステムの状態を大まかに観察できますが、メモリの状態を詳細に分析することはできません。詳細な分析には Allocations テンプレートが適しています。このテンプレートに含まれる **VM Tracker** は、仮想メモリの状態を詳細に観察できる非常に強力なツールです。
70 |
71 | 
72 |
73 | まず、大きなメモリブロックの場合を観察してみました。
74 |
75 | 
76 |
77 | このグラフでは、Dirty Size (割り当てられた物理メモリのうち、実際に使用されている領域の総量)と Resident Size がほぼ連動して動いています。両方とも解放後に値が減少しています(元の値にまでは戻りませんが、それはここでは無視してください2)。
78 |
79 | 次に、小さなメモリブロックの場合を観察してみました。
80 |
81 | 
82 |
83 | Activity Monitor で確認したときのように、Resident Size が元に戻らない現象が発生しています。ただし、Dirty Size の方は適切に減少していることが分かります。つまりこれは「メモリは正しく解放されているが、Malloc がリソースの返却を保留している」という状態を示しています。
84 |
85 | VM Tracker の詳細ビューを使って、tiny zone や small zone が確保している領域に注目してみましょう。
86 |
87 | 
88 |
89 | これらの領域はメモリ確保に伴い Resident Size と Dirty Size が増えていきますが、解放の際は Dirty Size だけが減少しています。他のアプリを起動して適度にメモリプレッシャーを与えると、Resident Size も適切なサイズにまで縮小されました。
90 |
91 | > 2 使用メモリ領域の拡大に伴い、Instruments が使用するメモリ領域も拡大していきます。この領域は一旦拡大すると縮小することがないため、どうしても元通りにはなりません。
92 |
93 | ## まとめ
94 |
95 | iOS アプリにおけるメモリ消費量を観察する目的で Resident Size を用いることがありますが、この値には malloc が返却を保留している分も含めて計上されます。そのため、リアルタイムな観察を行うには適していません。
96 |
97 | 他方で、Resident Size はメモリ不足時にプロセスを破棄する判断基準として用いられるため3、この値がある種の重要性を持つことは確かです。
98 |
99 | 以上の考察をまとめると、次のように考えるのが良いのかもしれません。
100 |
101 | - Resident Size はアプリのメモリ消費の**ピーク量**を把握するには適切な指標である。
102 | - アプリ内でもリアルタイムなメモリ使用量を把握する目的で Resident Size を観察するのは適切でない。
103 | - ある瞬間におけるメモリ消費の実態を把握するには Allocations と VM Tracker の併用が欠かせない。
104 |
105 | > 3 実際の iOS の仕様を知ることはできませんが、参考資料に挙げる XNU のソースコードでは task_basic_info.resident_size が多くの箇所で用いられていることから、この値が意味を持つことが推測されます。
106 |
107 | ## 参考資料
108 |
109 | - [Memory Usage Performance Guidelines](https://developer.apple.com/library/IOs/documentation/Performance/Conceptual/ManagingMemory/ManagingMemory.html)
110 |
111 | Apple の公式なガイドラインです。
112 |
113 | - [A look at how malloc works on the Mac](http://www.cocoawithlove.com/2010/05/look-at-how-malloc-works-on-mac.html)
114 |
115 | Mac OS X における malloc の挙動を解説しています。そのほとんどの記述は iOS でも参考になります。
116 |
117 | - [magazine_malloc.c](http://www.opensource.apple.com/source/Libc/Libc-825.40.1/gen/magazine_malloc.c)
118 |
119 | Mac OS X で使用されている Libc 内のメモリアロケーターの実装です。現状の iOS でもこれに近いものが使用されていると推測されます。
120 |
121 | - [kern_memorystatus.c](http://www.opensource.apple.com/source/xnu/xnu-2050.48.11/bsd/kern/kern_memorystatus.c)
122 |
123 | Mac OS X のカーネル (XNU) に含まれるメモリ消費量分析のソースコードです。メモリ不足時にプロセスを停止させるための機構 (Jetsam) が実装されています。iOS で用いられている同様の仕組みは、このコードに近いものであると推測されます。
124 |
125 | - [Mac OS X and iOS Internals: To the Apple's Core](http://www.newosxbook.com/)
126 |
127 | Mac OS X と iOS のカーネル実装について解説した書籍です。おすすめ。
128 |
--------------------------------------------------------------------------------
/MemoryConsumer.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 0FDEAAAF1817DF71002A1843 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0FDEAAAE1817DF71002A1843 /* Foundation.framework */; };
11 | 0FDEAAB11817DF71002A1843 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0FDEAAB01817DF71002A1843 /* CoreGraphics.framework */; };
12 | 0FDEAAB31817DF71002A1843 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0FDEAAB21817DF71002A1843 /* UIKit.framework */; };
13 | 0FDEAAB91817DF71002A1843 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0FDEAAB71817DF71002A1843 /* InfoPlist.strings */; };
14 | 0FDEAABB1817DF71002A1843 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FDEAABA1817DF71002A1843 /* main.m */; };
15 | 0FDEAABF1817DF71002A1843 /* MemoryConsumerAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FDEAABE1817DF71002A1843 /* MemoryConsumerAppDelegate.m */; };
16 | 0FDEAAC21817DF71002A1843 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0FDEAAC01817DF71002A1843 /* Main.storyboard */; };
17 | 0FDEAAC51817DF71002A1843 /* MemoryConsumerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FDEAAC41817DF71002A1843 /* MemoryConsumerViewController.m */; };
18 | 0FDEAAC71817DF71002A1843 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0FDEAAC61817DF71002A1843 /* Images.xcassets */; };
19 | 0FDEAACE1817DF71002A1843 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0FDEAACD1817DF71002A1843 /* XCTest.framework */; };
20 | 0FDEAACF1817DF71002A1843 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0FDEAAAE1817DF71002A1843 /* Foundation.framework */; };
21 | 0FDEAAD01817DF71002A1843 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0FDEAAB21817DF71002A1843 /* UIKit.framework */; };
22 | 0FDEAAD81817DF71002A1843 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0FDEAAD61817DF71002A1843 /* InfoPlist.strings */; };
23 | 0FDEAADA1817DF71002A1843 /* MemoryConsumerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FDEAAD91817DF71002A1843 /* MemoryConsumerTests.m */; };
24 | /* End PBXBuildFile section */
25 |
26 | /* Begin PBXContainerItemProxy section */
27 | 0FDEAAD11817DF71002A1843 /* PBXContainerItemProxy */ = {
28 | isa = PBXContainerItemProxy;
29 | containerPortal = 0FDEAAA31817DF71002A1843 /* Project object */;
30 | proxyType = 1;
31 | remoteGlobalIDString = 0FDEAAAA1817DF71002A1843;
32 | remoteInfo = MemoryConsumer;
33 | };
34 | /* End PBXContainerItemProxy section */
35 |
36 | /* Begin PBXFileReference section */
37 | 0FDEAAAB1817DF71002A1843 /* MemoryConsumer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MemoryConsumer.app; sourceTree = BUILT_PRODUCTS_DIR; };
38 | 0FDEAAAE1817DF71002A1843 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
39 | 0FDEAAB01817DF71002A1843 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
40 | 0FDEAAB21817DF71002A1843 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
41 | 0FDEAAB61817DF71002A1843 /* MemoryConsumer-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "MemoryConsumer-Info.plist"; sourceTree = ""; };
42 | 0FDEAAB81817DF71002A1843 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; };
43 | 0FDEAABA1817DF71002A1843 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
44 | 0FDEAABC1817DF71002A1843 /* MemoryConsumer-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MemoryConsumer-Prefix.pch"; sourceTree = ""; };
45 | 0FDEAABD1817DF71002A1843 /* MemoryConsumerAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MemoryConsumerAppDelegate.h; sourceTree = ""; };
46 | 0FDEAABE1817DF71002A1843 /* MemoryConsumerAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MemoryConsumerAppDelegate.m; sourceTree = ""; };
47 | 0FDEAAC11817DF71002A1843 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
48 | 0FDEAAC31817DF71002A1843 /* MemoryConsumerViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MemoryConsumerViewController.h; sourceTree = ""; };
49 | 0FDEAAC41817DF71002A1843 /* MemoryConsumerViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MemoryConsumerViewController.m; sourceTree = ""; };
50 | 0FDEAAC61817DF71002A1843 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; };
51 | 0FDEAACC1817DF71002A1843 /* MemoryConsumerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MemoryConsumerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
52 | 0FDEAACD1817DF71002A1843 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
53 | 0FDEAAD51817DF71002A1843 /* MemoryConsumerTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "MemoryConsumerTests-Info.plist"; sourceTree = ""; };
54 | 0FDEAAD71817DF71002A1843 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; };
55 | 0FDEAAD91817DF71002A1843 /* MemoryConsumerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MemoryConsumerTests.m; sourceTree = ""; };
56 | /* End PBXFileReference section */
57 |
58 | /* Begin PBXFrameworksBuildPhase section */
59 | 0FDEAAA81817DF71002A1843 /* Frameworks */ = {
60 | isa = PBXFrameworksBuildPhase;
61 | buildActionMask = 2147483647;
62 | files = (
63 | 0FDEAAB11817DF71002A1843 /* CoreGraphics.framework in Frameworks */,
64 | 0FDEAAB31817DF71002A1843 /* UIKit.framework in Frameworks */,
65 | 0FDEAAAF1817DF71002A1843 /* Foundation.framework in Frameworks */,
66 | );
67 | runOnlyForDeploymentPostprocessing = 0;
68 | };
69 | 0FDEAAC91817DF71002A1843 /* Frameworks */ = {
70 | isa = PBXFrameworksBuildPhase;
71 | buildActionMask = 2147483647;
72 | files = (
73 | 0FDEAACE1817DF71002A1843 /* XCTest.framework in Frameworks */,
74 | 0FDEAAD01817DF71002A1843 /* UIKit.framework in Frameworks */,
75 | 0FDEAACF1817DF71002A1843 /* Foundation.framework in Frameworks */,
76 | );
77 | runOnlyForDeploymentPostprocessing = 0;
78 | };
79 | /* End PBXFrameworksBuildPhase section */
80 |
81 | /* Begin PBXGroup section */
82 | 0FDEAAA21817DF71002A1843 = {
83 | isa = PBXGroup;
84 | children = (
85 | 0FDEAAB41817DF71002A1843 /* MemoryConsumer */,
86 | 0FDEAAD31817DF71002A1843 /* MemoryConsumerTests */,
87 | 0FDEAAAD1817DF71002A1843 /* Frameworks */,
88 | 0FDEAAAC1817DF71002A1843 /* Products */,
89 | );
90 | sourceTree = "";
91 | };
92 | 0FDEAAAC1817DF71002A1843 /* Products */ = {
93 | isa = PBXGroup;
94 | children = (
95 | 0FDEAAAB1817DF71002A1843 /* MemoryConsumer.app */,
96 | 0FDEAACC1817DF71002A1843 /* MemoryConsumerTests.xctest */,
97 | );
98 | name = Products;
99 | sourceTree = "";
100 | };
101 | 0FDEAAAD1817DF71002A1843 /* Frameworks */ = {
102 | isa = PBXGroup;
103 | children = (
104 | 0FDEAAAE1817DF71002A1843 /* Foundation.framework */,
105 | 0FDEAAB01817DF71002A1843 /* CoreGraphics.framework */,
106 | 0FDEAAB21817DF71002A1843 /* UIKit.framework */,
107 | 0FDEAACD1817DF71002A1843 /* XCTest.framework */,
108 | );
109 | name = Frameworks;
110 | sourceTree = "";
111 | };
112 | 0FDEAAB41817DF71002A1843 /* MemoryConsumer */ = {
113 | isa = PBXGroup;
114 | children = (
115 | 0FDEAABD1817DF71002A1843 /* MemoryConsumerAppDelegate.h */,
116 | 0FDEAABE1817DF71002A1843 /* MemoryConsumerAppDelegate.m */,
117 | 0FDEAAC01817DF71002A1843 /* Main.storyboard */,
118 | 0FDEAAC31817DF71002A1843 /* MemoryConsumerViewController.h */,
119 | 0FDEAAC41817DF71002A1843 /* MemoryConsumerViewController.m */,
120 | 0FDEAAC61817DF71002A1843 /* Images.xcassets */,
121 | 0FDEAAB51817DF71002A1843 /* Supporting Files */,
122 | );
123 | path = MemoryConsumer;
124 | sourceTree = "";
125 | };
126 | 0FDEAAB51817DF71002A1843 /* Supporting Files */ = {
127 | isa = PBXGroup;
128 | children = (
129 | 0FDEAAB61817DF71002A1843 /* MemoryConsumer-Info.plist */,
130 | 0FDEAAB71817DF71002A1843 /* InfoPlist.strings */,
131 | 0FDEAABA1817DF71002A1843 /* main.m */,
132 | 0FDEAABC1817DF71002A1843 /* MemoryConsumer-Prefix.pch */,
133 | );
134 | name = "Supporting Files";
135 | sourceTree = "";
136 | };
137 | 0FDEAAD31817DF71002A1843 /* MemoryConsumerTests */ = {
138 | isa = PBXGroup;
139 | children = (
140 | 0FDEAAD91817DF71002A1843 /* MemoryConsumerTests.m */,
141 | 0FDEAAD41817DF71002A1843 /* Supporting Files */,
142 | );
143 | path = MemoryConsumerTests;
144 | sourceTree = "";
145 | };
146 | 0FDEAAD41817DF71002A1843 /* Supporting Files */ = {
147 | isa = PBXGroup;
148 | children = (
149 | 0FDEAAD51817DF71002A1843 /* MemoryConsumerTests-Info.plist */,
150 | 0FDEAAD61817DF71002A1843 /* InfoPlist.strings */,
151 | );
152 | name = "Supporting Files";
153 | sourceTree = "";
154 | };
155 | /* End PBXGroup section */
156 |
157 | /* Begin PBXNativeTarget section */
158 | 0FDEAAAA1817DF71002A1843 /* MemoryConsumer */ = {
159 | isa = PBXNativeTarget;
160 | buildConfigurationList = 0FDEAADD1817DF71002A1843 /* Build configuration list for PBXNativeTarget "MemoryConsumer" */;
161 | buildPhases = (
162 | 0FDEAAA71817DF71002A1843 /* Sources */,
163 | 0FDEAAA81817DF71002A1843 /* Frameworks */,
164 | 0FDEAAA91817DF71002A1843 /* Resources */,
165 | );
166 | buildRules = (
167 | );
168 | dependencies = (
169 | );
170 | name = MemoryConsumer;
171 | productName = MemoryConsumer;
172 | productReference = 0FDEAAAB1817DF71002A1843 /* MemoryConsumer.app */;
173 | productType = "com.apple.product-type.application";
174 | };
175 | 0FDEAACB1817DF71002A1843 /* MemoryConsumerTests */ = {
176 | isa = PBXNativeTarget;
177 | buildConfigurationList = 0FDEAAE01817DF71002A1843 /* Build configuration list for PBXNativeTarget "MemoryConsumerTests" */;
178 | buildPhases = (
179 | 0FDEAAC81817DF71002A1843 /* Sources */,
180 | 0FDEAAC91817DF71002A1843 /* Frameworks */,
181 | 0FDEAACA1817DF71002A1843 /* Resources */,
182 | );
183 | buildRules = (
184 | );
185 | dependencies = (
186 | 0FDEAAD21817DF71002A1843 /* PBXTargetDependency */,
187 | );
188 | name = MemoryConsumerTests;
189 | productName = MemoryConsumerTests;
190 | productReference = 0FDEAACC1817DF71002A1843 /* MemoryConsumerTests.xctest */;
191 | productType = "com.apple.product-type.bundle.unit-test";
192 | };
193 | /* End PBXNativeTarget section */
194 |
195 | /* Begin PBXProject section */
196 | 0FDEAAA31817DF71002A1843 /* Project object */ = {
197 | isa = PBXProject;
198 | attributes = {
199 | CLASSPREFIX = MemoryConsumer;
200 | LastUpgradeCheck = 0500;
201 | ORGANIZATIONNAME = "Radium Software";
202 | TargetAttributes = {
203 | 0FDEAACB1817DF71002A1843 = {
204 | TestTargetID = 0FDEAAAA1817DF71002A1843;
205 | };
206 | };
207 | };
208 | buildConfigurationList = 0FDEAAA61817DF71002A1843 /* Build configuration list for PBXProject "MemoryConsumer" */;
209 | compatibilityVersion = "Xcode 3.2";
210 | developmentRegion = English;
211 | hasScannedForEncodings = 0;
212 | knownRegions = (
213 | en,
214 | Base,
215 | );
216 | mainGroup = 0FDEAAA21817DF71002A1843;
217 | productRefGroup = 0FDEAAAC1817DF71002A1843 /* Products */;
218 | projectDirPath = "";
219 | projectRoot = "";
220 | targets = (
221 | 0FDEAAAA1817DF71002A1843 /* MemoryConsumer */,
222 | 0FDEAACB1817DF71002A1843 /* MemoryConsumerTests */,
223 | );
224 | };
225 | /* End PBXProject section */
226 |
227 | /* Begin PBXResourcesBuildPhase section */
228 | 0FDEAAA91817DF71002A1843 /* Resources */ = {
229 | isa = PBXResourcesBuildPhase;
230 | buildActionMask = 2147483647;
231 | files = (
232 | 0FDEAAC71817DF71002A1843 /* Images.xcassets in Resources */,
233 | 0FDEAAB91817DF71002A1843 /* InfoPlist.strings in Resources */,
234 | 0FDEAAC21817DF71002A1843 /* Main.storyboard in Resources */,
235 | );
236 | runOnlyForDeploymentPostprocessing = 0;
237 | };
238 | 0FDEAACA1817DF71002A1843 /* Resources */ = {
239 | isa = PBXResourcesBuildPhase;
240 | buildActionMask = 2147483647;
241 | files = (
242 | 0FDEAAD81817DF71002A1843 /* InfoPlist.strings in Resources */,
243 | );
244 | runOnlyForDeploymentPostprocessing = 0;
245 | };
246 | /* End PBXResourcesBuildPhase section */
247 |
248 | /* Begin PBXSourcesBuildPhase section */
249 | 0FDEAAA71817DF71002A1843 /* Sources */ = {
250 | isa = PBXSourcesBuildPhase;
251 | buildActionMask = 2147483647;
252 | files = (
253 | 0FDEAABB1817DF71002A1843 /* main.m in Sources */,
254 | 0FDEAABF1817DF71002A1843 /* MemoryConsumerAppDelegate.m in Sources */,
255 | 0FDEAAC51817DF71002A1843 /* MemoryConsumerViewController.m in Sources */,
256 | );
257 | runOnlyForDeploymentPostprocessing = 0;
258 | };
259 | 0FDEAAC81817DF71002A1843 /* Sources */ = {
260 | isa = PBXSourcesBuildPhase;
261 | buildActionMask = 2147483647;
262 | files = (
263 | 0FDEAADA1817DF71002A1843 /* MemoryConsumerTests.m in Sources */,
264 | );
265 | runOnlyForDeploymentPostprocessing = 0;
266 | };
267 | /* End PBXSourcesBuildPhase section */
268 |
269 | /* Begin PBXTargetDependency section */
270 | 0FDEAAD21817DF71002A1843 /* PBXTargetDependency */ = {
271 | isa = PBXTargetDependency;
272 | target = 0FDEAAAA1817DF71002A1843 /* MemoryConsumer */;
273 | targetProxy = 0FDEAAD11817DF71002A1843 /* PBXContainerItemProxy */;
274 | };
275 | /* End PBXTargetDependency section */
276 |
277 | /* Begin PBXVariantGroup section */
278 | 0FDEAAB71817DF71002A1843 /* InfoPlist.strings */ = {
279 | isa = PBXVariantGroup;
280 | children = (
281 | 0FDEAAB81817DF71002A1843 /* en */,
282 | );
283 | name = InfoPlist.strings;
284 | sourceTree = "";
285 | };
286 | 0FDEAAC01817DF71002A1843 /* Main.storyboard */ = {
287 | isa = PBXVariantGroup;
288 | children = (
289 | 0FDEAAC11817DF71002A1843 /* Base */,
290 | );
291 | name = Main.storyboard;
292 | sourceTree = "";
293 | };
294 | 0FDEAAD61817DF71002A1843 /* InfoPlist.strings */ = {
295 | isa = PBXVariantGroup;
296 | children = (
297 | 0FDEAAD71817DF71002A1843 /* en */,
298 | );
299 | name = InfoPlist.strings;
300 | sourceTree = "";
301 | };
302 | /* End PBXVariantGroup section */
303 |
304 | /* Begin XCBuildConfiguration section */
305 | 0FDEAADB1817DF71002A1843 /* Debug */ = {
306 | isa = XCBuildConfiguration;
307 | buildSettings = {
308 | ALWAYS_SEARCH_USER_PATHS = NO;
309 | ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)";
310 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
311 | CLANG_CXX_LIBRARY = "libc++";
312 | CLANG_ENABLE_MODULES = YES;
313 | CLANG_ENABLE_OBJC_ARC = YES;
314 | CLANG_WARN_BOOL_CONVERSION = YES;
315 | CLANG_WARN_CONSTANT_CONVERSION = YES;
316 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
317 | CLANG_WARN_EMPTY_BODY = YES;
318 | CLANG_WARN_ENUM_CONVERSION = YES;
319 | CLANG_WARN_INT_CONVERSION = YES;
320 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
321 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
322 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
323 | COPY_PHASE_STRIP = NO;
324 | GCC_C_LANGUAGE_STANDARD = gnu99;
325 | GCC_DYNAMIC_NO_PIC = NO;
326 | GCC_OPTIMIZATION_LEVEL = 0;
327 | GCC_PREPROCESSOR_DEFINITIONS = (
328 | "DEBUG=1",
329 | "$(inherited)",
330 | );
331 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
332 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
333 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
334 | GCC_WARN_UNDECLARED_SELECTOR = YES;
335 | GCC_WARN_UNINITIALIZED_AUTOS = YES;
336 | GCC_WARN_UNUSED_FUNCTION = YES;
337 | GCC_WARN_UNUSED_VARIABLE = YES;
338 | IPHONEOS_DEPLOYMENT_TARGET = 7.0;
339 | ONLY_ACTIVE_ARCH = YES;
340 | SDKROOT = iphoneos;
341 | };
342 | name = Debug;
343 | };
344 | 0FDEAADC1817DF71002A1843 /* Release */ = {
345 | isa = XCBuildConfiguration;
346 | buildSettings = {
347 | ALWAYS_SEARCH_USER_PATHS = NO;
348 | ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)";
349 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
350 | CLANG_CXX_LIBRARY = "libc++";
351 | CLANG_ENABLE_MODULES = YES;
352 | CLANG_ENABLE_OBJC_ARC = YES;
353 | CLANG_WARN_BOOL_CONVERSION = YES;
354 | CLANG_WARN_CONSTANT_CONVERSION = YES;
355 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
356 | CLANG_WARN_EMPTY_BODY = YES;
357 | CLANG_WARN_ENUM_CONVERSION = YES;
358 | CLANG_WARN_INT_CONVERSION = YES;
359 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
360 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
361 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
362 | COPY_PHASE_STRIP = YES;
363 | ENABLE_NS_ASSERTIONS = NO;
364 | GCC_C_LANGUAGE_STANDARD = gnu99;
365 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
366 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
367 | GCC_WARN_UNDECLARED_SELECTOR = YES;
368 | GCC_WARN_UNINITIALIZED_AUTOS = YES;
369 | GCC_WARN_UNUSED_FUNCTION = YES;
370 | GCC_WARN_UNUSED_VARIABLE = YES;
371 | IPHONEOS_DEPLOYMENT_TARGET = 7.0;
372 | SDKROOT = iphoneos;
373 | VALIDATE_PRODUCT = YES;
374 | };
375 | name = Release;
376 | };
377 | 0FDEAADE1817DF71002A1843 /* Debug */ = {
378 | isa = XCBuildConfiguration;
379 | buildSettings = {
380 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
381 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
382 | GCC_PRECOMPILE_PREFIX_HEADER = YES;
383 | GCC_PREFIX_HEADER = "MemoryConsumer/MemoryConsumer-Prefix.pch";
384 | INFOPLIST_FILE = "MemoryConsumer/MemoryConsumer-Info.plist";
385 | PRODUCT_NAME = "$(TARGET_NAME)";
386 | WRAPPER_EXTENSION = app;
387 | };
388 | name = Debug;
389 | };
390 | 0FDEAADF1817DF71002A1843 /* Release */ = {
391 | isa = XCBuildConfiguration;
392 | buildSettings = {
393 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
394 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
395 | GCC_PRECOMPILE_PREFIX_HEADER = YES;
396 | GCC_PREFIX_HEADER = "MemoryConsumer/MemoryConsumer-Prefix.pch";
397 | INFOPLIST_FILE = "MemoryConsumer/MemoryConsumer-Info.plist";
398 | PRODUCT_NAME = "$(TARGET_NAME)";
399 | WRAPPER_EXTENSION = app;
400 | };
401 | name = Release;
402 | };
403 | 0FDEAAE11817DF71002A1843 /* Debug */ = {
404 | isa = XCBuildConfiguration;
405 | buildSettings = {
406 | ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)";
407 | BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/MemoryConsumer.app/MemoryConsumer";
408 | FRAMEWORK_SEARCH_PATHS = (
409 | "$(SDKROOT)/Developer/Library/Frameworks",
410 | "$(inherited)",
411 | "$(DEVELOPER_FRAMEWORKS_DIR)",
412 | );
413 | GCC_PRECOMPILE_PREFIX_HEADER = YES;
414 | GCC_PREFIX_HEADER = "MemoryConsumer/MemoryConsumer-Prefix.pch";
415 | GCC_PREPROCESSOR_DEFINITIONS = (
416 | "DEBUG=1",
417 | "$(inherited)",
418 | );
419 | INFOPLIST_FILE = "MemoryConsumerTests/MemoryConsumerTests-Info.plist";
420 | PRODUCT_NAME = "$(TARGET_NAME)";
421 | TEST_HOST = "$(BUNDLE_LOADER)";
422 | WRAPPER_EXTENSION = xctest;
423 | };
424 | name = Debug;
425 | };
426 | 0FDEAAE21817DF71002A1843 /* Release */ = {
427 | isa = XCBuildConfiguration;
428 | buildSettings = {
429 | ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)";
430 | BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/MemoryConsumer.app/MemoryConsumer";
431 | FRAMEWORK_SEARCH_PATHS = (
432 | "$(SDKROOT)/Developer/Library/Frameworks",
433 | "$(inherited)",
434 | "$(DEVELOPER_FRAMEWORKS_DIR)",
435 | );
436 | GCC_PRECOMPILE_PREFIX_HEADER = YES;
437 | GCC_PREFIX_HEADER = "MemoryConsumer/MemoryConsumer-Prefix.pch";
438 | INFOPLIST_FILE = "MemoryConsumerTests/MemoryConsumerTests-Info.plist";
439 | PRODUCT_NAME = "$(TARGET_NAME)";
440 | TEST_HOST = "$(BUNDLE_LOADER)";
441 | WRAPPER_EXTENSION = xctest;
442 | };
443 | name = Release;
444 | };
445 | /* End XCBuildConfiguration section */
446 |
447 | /* Begin XCConfigurationList section */
448 | 0FDEAAA61817DF71002A1843 /* Build configuration list for PBXProject "MemoryConsumer" */ = {
449 | isa = XCConfigurationList;
450 | buildConfigurations = (
451 | 0FDEAADB1817DF71002A1843 /* Debug */,
452 | 0FDEAADC1817DF71002A1843 /* Release */,
453 | );
454 | defaultConfigurationIsVisible = 0;
455 | defaultConfigurationName = Release;
456 | };
457 | 0FDEAADD1817DF71002A1843 /* Build configuration list for PBXNativeTarget "MemoryConsumer" */ = {
458 | isa = XCConfigurationList;
459 | buildConfigurations = (
460 | 0FDEAADE1817DF71002A1843 /* Debug */,
461 | 0FDEAADF1817DF71002A1843 /* Release */,
462 | );
463 | defaultConfigurationIsVisible = 0;
464 | };
465 | 0FDEAAE01817DF71002A1843 /* Build configuration list for PBXNativeTarget "MemoryConsumerTests" */ = {
466 | isa = XCConfigurationList;
467 | buildConfigurations = (
468 | 0FDEAAE11817DF71002A1843 /* Debug */,
469 | 0FDEAAE21817DF71002A1843 /* Release */,
470 | );
471 | defaultConfigurationIsVisible = 0;
472 | };
473 | /* End XCConfigurationList section */
474 | };
475 | rootObject = 0FDEAAA31817DF71002A1843 /* Project object */;
476 | }
477 |
--------------------------------------------------------------------------------