Non-Mac App Store version!

Mon, 28 July It took us a lot longer than anticipated, but the non-MAS version of Objective-Clean is finally ready. Making a version of the app for use outside of the sandbox opens up a lot of new possibilities, including the following:

Continuous Integration

As many people have informed us, the MAS version of the app made CI support quite difficult. The sandbox restriction of explicitly authorizing access to certain directories caused lots of issues. This version is not bound to the restrictions of the sandbox and so CI will be a lot easier.

Site Licenses

We have also received a number of emails inquiring about site licenses. This makes sense because the management and procurement of MAS apps can be a pain to say the least. With the release of the non-Mac App Store version of our tool, you can now purchase a site license that allows you to use Objective-Clean on any computer at a site, or at multiple sites with a multi-site license. Each license will be entitled to receive the same updates that the MAS version will receive. Below is the pricing structure for site licenses:
  • Site License: $150.00 (USD)
  • Multi-Site License: $250.00 (USD)

To purchase a site license, please send us a payment via PayPal to our account at

Trial Version

We are also excited to annoucne a trial version of the app that lets you try everything out for 7 days before deciding to purchase the full version. Try the trial version today!

Looking Forward

We are thrilled with the support we have received for this project. We feel strnogly that due to the new and somewhat uncharted territory of Swift, a tool like ours would be even more valuable to help people and teams establish consistent developemnt patterns in their work. We are excited to announce that we will be making a version of our tool that has support for Swift! We don't have a timeline yet for completion, but we wanted to let you know that it is our intent to evolve and improve with Apple and their development tools.

Objective-Clean v1.6!

Tue, 13 May We have fixed a ton of bugs! Thanks to everyone who sent us emails, they are very helpful. In addition to lots of bug fixes, we have added a caching feature that will dramatically reduce the time objClean takes to run. Thanks for the idea, Hilton!

New Caching Feature

The first time that you run this new version of objClean, it will scan all the files in your project (that you have specified). You can see how long it took to run in the Log Navigator in Xcode (cmd+8). Then once you run it one more time, you should notice a significant increase in speed.

We now cache the results of each scan (a plist written to the sandboxed documents directory), and only scan files that have been updated since the last scan, or that had errors the last time we checked it. In other words, if a file doesn't have any issues, we don't even touch it. This ends up saving a ton of time!

Bug Fixes

The following bugs have been fixed:

- We have fixed the issue related to char escaping that was causing the run script to hang for some users.

- We do a better job of escaping quotes in big, gnarly emailRegEx strings (you know who you are :)

- We fixed the issue where having a '==' operator on the right side of an object declaration was throwing false warnings.

- We have added a manual install button to the interface that copies the run script string to your pasteboard so you can setup the build phase yourself if you need to. We are still experiencing issues installing the run script where workspaces and CocoaPods are involved, so manually adding the script is going to be your most reliable option at this point. Sorry for the inconvenience!

If you enjoy using our app, please consider leaving us a positive review on the App Store! You are all developers, you know how much of a difference a positive review can make!

Objective-Clean v1.5!

Wed, 12 Feb. We were originally planning on adding some more rules to this version, but due to the pressing nature of a few bugs, we are releasing this version early.

New Features

- We now allow you to list file system directories that you want to skip. The list is comma separated, and case sensitive. This option overrides the Prefixes to check field in priority.

Bug Fixes

The following bugs have been fixed:

- A fix has been made for users that were experiencing hanging issues when the script was run. Very sorry about that one!

- The default : (in switch statements) check had a bug that is now fixed

- Pointer references inside brackets is more stable: [*var

- We fixed a regression from the last version where there was a false error when there was a == on the right side of an = in combination with a ternary operation.

- Dictionary literal declarations are less prone to false errors.

- The static variable check now includes support for const and extern modifiers. This means that the static rule will apply to all three of those types of declarations.

- Better support for less-than and greater-than detection

- Negative NSNumber literals are now supported: @-1

- Pointer pointers are better supported: int **var = NULL;

- Char escaping has been improved to support multiple instances of chars on one line.

- We fixed a bug with the open/done buttons in Objective-Clean. They got a little mixed up.

- We have improved the way that we add the run script to the project file. It only adds the script to one target, and never in the test target. This finally allows you to remove the run script from Xcode without crashing. A VERY special thanks to @ffried for writing an awesome library to make the process much easier, and more reliable.

NOTE: It would be ideal to re-add the run script to your projects to take advantage of the improvements mentioned above.

What's next?

- There are some issues with single-line if statements that need to be addressed. We are probably going to add a rule to allow/not allow them in your projects, and do a better job of recognizing them.

As always, if you are seeing false errors, please send us a screenshot at and we will try and find a fix! Thanks for your patience and continued support as we continue to improve this tool!

If you like our app, it would mean a lot if you left us a positive review in the App Store! :-)

Objective-Clean v1.4!

Sat, 25 Jan. Objective-Clean just keeps getting better and better!

New Features

- Cocoapods support! Or un-support rather. Our tool will now ignore all files in the Pods/ folder. If you feel like this should be something you can turn on/off, let us know. But it seems pretty safe to say you aren't going to be making stylistic changes to other people's code.

- Workspace support! If Objective-Clean detects that there is a workspace with the same name and in the same folder as the project file you dropped in, after adding the run script to the project file, we'll give you the option of opening the workspace as well as the project.

Bug Fixes

- Single-line if statements are now checked the same as regular if statements (except for the { checks). - If you have a return statement as the only line in a switch statement, it isn't going to enforce the line above return statement rule if that is enabled.

- We ironed out a number of issues regarding the presence of both #pragmas and comments above @interface/@implementation declarations. Should work a lot better now!

- We have made a number of enhancements in deciphering the difference between the pointer and multiplication operators. It should still be known that issues remain with multi-line function declarations/calls. Still working on a fix!

- We’re now doing better at deciphering between casting and declarations in for loop declarations.

- Negative case numbers in switch statements will no longer throw spacing errors.

- Pointer references to the right of &&, ||, == operators won’t be treated as math anymore.

- Multi-line #define blocks (with \ marks at the end of each line) are all escaped together now.

- Char declarations are now escaped like regular strings.

- We fixed the regression that was introduced with the new less-than, greater-than operator checks not handling protocol casting correctly.

A very special thanks to everybody who submitted feedback. Thankfully, the bugs are starting to rapidly diminish in quantity. Thanks for your support!

Objective-Clean v1.3 is finally here.

Wed, 8 Jan.

A very special thanks to all of the users who have given us feedback to help us fix bugs and enhance the functionality of Objective-Clean! It is improving more and more everyday.

We have made a number of bug fixes and enhancements, including the following:


We have added the ability to skip blocks of code so that if you ever have an edge case that we aren't supporting yet, or if you just want to skip an entire file altogether, you can use the following syntax to have ObjClean skip over it:


//The code you want to ignore


Note that the comments are an important part of that syntax. You can place those markers anywhere you want and so long as there is a starting and ending marker in the same file, we will ignore everything in between.

Script enhancements

To improve the experience of using our tool in a team environment, we have added a check in the run script to first check if is installed on your computer (thanks, @ffried!). This means that team members who aren't using our tool, can still continue working with the run script installed in their build.

We have also included a check for a custom environment variable called SKIP_OBJCLEAN (thanks again, @ffried! Such a smart guy :). This gives you the ability to easily turn on/off the script depending on the build type (debug/release), or if you just want to turn it off temporarily without deleting the script. To add a user-defined build setting, select the target, and then go to Editor->Add Build Setting->Add User-Defined Setting and name it SKIP_OBJCLEAN.

New rules

- kNumberOfEmptyLinesAboveEnd. This allows you to specify how many empty lines you want above the @end. This applies for all @end instances, in all file types. The plist value type is number and you just put how many lines.

- kNumberOfEmptyLinesBeforePragma and kNumberOfEmptyLinesAfterPragma give you more fine-grain control. It is important to note that this rule sequence overrides BOTH the @end rules, and the lines between rule.

- kComparisonSpacingRule. This rule separates the < and > operators from the math operator spacing check. This will give you the ability to support this type of format: if (1+2 > 2+3).

If you haven’t gone online and reviewed the survey recently, please do! These new questions will be added today.

Bug fixes

- Fixes for better casting recognition.

- Fixes for improved pointer/multiplication distinction.

- The recently added @property declaration check has been fixed to work correctly.

- We now ignore the contents of #warning declarations.

- We have improved the accuracy of detecting the negative operator vs the minus operator (in multi-line method calls with parameters for example).

- Fixed a bug where single-line if statements were wreaking havoc on surrounding code. If you’re into single line ifs, should be a lot better now.

- Fixed the issue with casting in a return statement.

- When using the ternary operator, ?: will no longer throw a false error.

- The line spacing below @implementation rule now knows not to complain when there are scope braces around, indicating ivar declarations).

- Dict literal declarations are tested more accurately.

- You can now have more than one #pragma next to each other, they just can’t have any spaces between them.

- We now escape strings that don’t start with the @ sign as well.

- We fixed the issue where the space after comma was conflicting with math operator spacing. The comma wins.

- The following uses of the pointer are now valid: [*var doSomething];, (*var), [self doSomething:*var];

- The = sign in a @property declaration is now ignored.

- Due to the potential for craziness within #define declarations, we have decided to ignore them as well.

- Fixed the false positives around -= and -> operators.

- A space before an opening brace isn’t required if it is a literal declaration.

- We have improved negative operator recognition within the ternary operator.

- We correctly enforce : and { spacing for ‘default’ in a switch statement.

- Improved support for multiple operators that do different things on one line (like * (math) and * (pointer))

- Multiplication in a static variable declaration will no longer throw an error.


You have stuck with us throughout this painful improvement process, and we know it hasn't been easy. We missed a lot of bugs at the outset, and we are very sorry. It has taken us quite a bit of time to work through and resolve these issues, but we are very excited about this release and hope that you will enjoy it. Please continue to send us feedback and we will continue to enhance and improve this app!

If you have made it this far, and can appreciate how much work has gone into this build (hint: a lot :), perhaps you might consider leaving a positive review on the App Store.

Thank you!