1) It crashes. A lot. I remember back in the early days of Eclipse, it would crash pretty frequently. It's funny because I had forgotten all about that until I started using Xcode. Then I remembered what it's like to be using a shitty IDE which crashes all the time. Ironically enough, Eclipse NEVER crashes on my Mac, but Xcode, which is an Apple product, is crashing on its own hardware.
2) It manages the project files and their hierarchy using a shitty flat file (pbxproj). This means if you want to use Finder to organize your project, which is sure to have tons of graphical assets, forget about it. If you try to copy a file from Finder into your Xcode project and that file exists on the file system but not in the Xcode flat file, it throws an error. You have to go into Finder, find the orphaned file, delete it, then go back to your copying operation. And the actual files on your file system are in one big gigantic mess.
This is how Xcode manages your file hierarchy and project workspace
3) I have never seen something have such tremendous lag and failure rate when connecting to the emulator. Approximately 50% of the time Xcode will just hang, and never connect to the emulator when I run the project. Ditto goes for running the project on a device. There have been numerous times i just have to kill Xcode.
4) Speaking of killing Xcode, sometimes I have to reboot my entire machine. Xcode can leave zombie processes of your app running, and these zombies can prevent you from doing any more deployments to the emulator. ps -el | grep 'Z' can show you if you are afflicted. A similar bug can happen on the hardware where you have to reboot the hardware, restart Xcode, or both.
5) IOS4 vs IOS5. Come on Apple, I am begging you to not turn IOS into the next Internet Explorer. That would be so sad. Granted, the backwards compatibility is 'ok', but it's not amazing. For starters, storyboards don't really work on IOS4. You can get it to build with storyboards, but you cannot instantiate a UIViewController from the storyboard. You have to do it from the nib. Some key methods are deprecated, so if you want to stretch an image over a button you'll need to check if your UIImage has the right selector.
You'll need some code like this for stretching images in IOS4 and 5
6) Connecting UI elements to their IBOutlet is the most annoying thing I have ever done in an IDE. First you add a text field, then you add the IBOutlet to the interface, synthesize the object, then click and drag a line from the UI element to the parent class and select the correct outlet from a menu. Are they f*&king smoking a pound of crack over there? I thought Apple was the paragon of design perfection and usability. Who the hell designed that? At the very best, adding a UI element should somehow automatically build out the declaration in the interface, synthesize it and do whatever the hell that blue line connector does. But at the very worst, I should be able to click something that just does all that for me, and I simply provide an argument name.
Well, there's plenty more to say, but after about 5 seconds of googling, I see I am not the only one. Maybe all of this is solvable, perhaps some of you know a way around all of this nonsense. If so, please do let me know. Otherwise, I hope the Xcode team gets it together and really makes this software usable and stable. Their market is getting massive, and if they want to prevent a few less gray hairs in this world, they could do us all a huge favor and make the IDE a bit more sane.
I am using XCode 4.3.1
Dev/Code/Hack is a technology and business blog by me, Par Trivedi. I'm a software engineer and I've been writing code and managing teams for over a decade. This blog serves as a way to share thoughts and ideas about the tech/startup community, and also to educate newcomers to software development.