11

After converting an Xcode project to ARC (Automatic Reference Counting), I need to disable ARC for some of my source files (mainly third-party code).

I know I need to set the "-fno-objc-arc" flag for each of these files, but Xcode doesn't give me a option for batch editing - I need to add this flag to each file manually, which may be tedious if you need to set it for multiple files.

Does anyone have a smart approach to this?

Evan Mulawski
  • 54,662
  • 15
  • 117
  • 144
Chris Chen
  • 5,307
  • 4
  • 45
  • 49

3 Answers3

23

Select the ones you want to add the flag to (using Shift and/or Command) and press Enter to display the flag editor. Press Done to apply the entered flag(s) to the selected file(s).

Tutorial

I have composed a blog post to serve as a tutorial for this process.

Evan Mulawski
  • 54,662
  • 15
  • 117
  • 144
2

By far the simplest option is just use the ARC conversion tool under Edit > Refactor.

It's not very clear, but basically you just check any files you want to use ARC and uncheck any that you don't. This will do the following:

1) Files that are unchecked will have the -fno-objc-arc flag applied

2) Files that are checked will be converted to ARC

3) Files that are checked that have already been converted to ARC will be untouched

Read that again carefully. What sometimes confuses people is that they assume that files that are already converted should be left unchecked when running the tool again, but this will incorrectly apply the -fno-objc-arc to those files (resulting in leaks).

You should think of the ARC Conversion tool as a "batch-select ARC compatible files and convert files that aren't already ARC" tool instead of a straight conversion tool.

You can run the conversion tool as many times as you want - the effects are not cumulative (although converting files to ARC is not reversible).

Nick Lockwood
  • 40,865
  • 11
  • 112
  • 103
1

I need to set files that are not supposed to support ARC (mainly 3rd-party code).

In addition to managing the flags, you could simply create a static library for these sources, then link.

justin
  • 104,054
  • 14
  • 179
  • 226
  • I find library making to be a confusing and often futile process. With all the time you've spent checking headers and tweaking build settings, you could have simply set the compiler flags and have been done with it. – CodaFi Apr 17 '12 at 03:50
  • @CodaFi after having written and configured many libraries, my opinion is entirely the opposite :) – justin Apr 17 '12 at 05:02
  • I think it all depends on how many apps you have to maintain. – nycynik Apr 17 '12 at 23:36
  • @CodaFi there are many more variables. for example, i use much higher warning and optimization settings than typical third party libs. this may either produce a lot of noise among my build output, or even the incorrect results. as well, i don't want the main project (my code) to have all sorts noise such as odd preprocessor defines, header dependencies, or unusual discovery paths many third party programs end up using. – justin Apr 18 '12 at 00:01