views:

1450

answers:

9

I'm a highly skilled Java dev contemplating learning iPhone development. Mac only dev aspects aside, how much of a leap would learning the mobile application stack be? Sure I understand that its closer to C in how one should approach it, and with that comes memory management and so on.

My queries would also include

  1. How well is OOP/OOAD supported?
  2. Is there some API(s) which enable unit testing?

I'd encourage those who answer to quote external sites and references to help elaborate the detail

+2  A: 

Objective-C is an object oriented language so, as far as OOP is concerned, pretty much anything you can do in Java you can do with Obj-C.

I don't have any experience with it but here's at least one resource on OCUnit, the objective-c equivalent to JUnit: http://developer.apple.com/tools/unittest.html

The biggest problem I'm having with the transition is definitely the memory-management aspect. Learning the syntax and APIs is pretty straight forward but life's tough without the GC!

EDIT: Oh yeah, the second biggest problem is XCode, the IDE used for Mac/iPhone development. Refactoring support is minimal and I find it a pain to navigate between files. Expect this to slow you down quite a bit, too.

Outlaw Programmer
Seriously - somebody needs to make an Eclipse for iPhone development. XCode sucks compared to Eclipse.
Paul Tomblin
So memory management, pointers and GC is left entirely to us.. So we can expect to see re-inventions of that wheel (in some cases yielding better results/performance/fit-to-purpose, but often not) per person / project / dev team etc. Does the iPhone itself have quirks relating to mem mgmt?
j pimmel
Memory management using reference counting is pretty much painless. I used to fear to code without GC, now it’s a non-issue. Memory management on iPhone is also pretty much boring, apart from the memory limit, should you go for something memory intensive.
zoul
Moving between files is actually pretty quick if you make use of all the keyboard shortcuts, liek Cmd-Click on class and method names and Open Quickly, along with Cmd-Alt up-arrow to toggle between implementation and header files.
Kendall Helmstetter Gelner
Also, OCUnit is not really there in the iPhone version of the SDK so you may want to look at this more leightweight unit testing framework for iPhone stuff:http://code.google.com/p/google-toolbox-for-mac/wiki/iPhoneUnitTesting
Kendall Helmstetter Gelner
+9  A: 

The development language is Objective-C, which is pure C with a very thin object wrapper over the top. They syntax is kind of weird looking, but it's pretty easy to get to grips with if you know C once you get over the message calls - myself I have a solid C background and only started picking up Objective-C a month or two so back but I'm finding it really rather pleasing - more so than C++.

The difficulty you're going to have if you have only coded Java is pointers and memory management. Memory management isn't conceptually hard as it's simply (!) a question of keeping track of what you are allocating and releasing, plus XCode seems to come with good tools for detecting leaks (although I haven't used these in anger yet) - and as iPhone programs are relatively small it's not like coding a big system program where this can be extremely tough. The major conceptual difficulty you are likely to have is simply getting your head around pointers as they are used extensively (as in just about on every line of code) and you do need to grok these completely. One of Joel's reoccuring themes on the podcast is the difficulty some coders get using pointers, so I'd recommend you take that carefully and possibly pick up a good book - perhaps the original K&R.

Someone may like to correct me, but although the Cocoa API appears excellent, there seem to be few libraries available outside the framework (unlike C++ or Java). For instance I had to add my own queue and stack classes - although the NSMutableArray makes that extremely easy.

All in all though I'm certainly finding it one the most fun platforms to play with I've used for a while.

Cruachan
How do app developers avoid treading on other apps? Are there best practices, ways to help manage that?
j pimmel
j pimmel
Cruachan
Cheers. Also, Joel who?
j pimmel
@j: don’t be afraid of Google, a simple “joel pointers” will take you a long way.
zoul
Lots of pointers? That's not what I'm encountering. I did C/C++ back in the early 90's, and have been doing nearly 100% Java since it came on the scene. I find that in daily usage for the iPhone, it's extremely rare to have to deal with anything more esoteric than a "pointer to an object", which isn't really that different from what you have in Java (albeit with a different syntax.) I haven't had to deal with pointer arithmetic, function pointers, or anything else complicated.
Caffeine Coma
I'm not so sure about the "very thin object wrapper". It sounds like Objective-C is just C and then some extra few features. That isn't the case.
Arne Evertsson
+1  A: 

Well, Java was based on Objective C and Smalltalk, which are object oriented languages. The big issues will be syntax (which is not entirely C based like C++ and Java), pointers and manual memory management.

This is based on some very old Objective C knowledge, but I do know that when I switched from Objective C to Java (around 2000), it was pretty easy since the underlying concepts were pretty close.

Based on Objective C

Memory management

Robin
+1  A: 

I wouldn't say that I'm an expert in any language but I'm competent in a few. Most of the code I've written recently has been "enterprise"-type stuff.

Assuming you're comfortable learning a new API and language, the biggest difference I found is how constrained the iPhone is in terms of CPU performance and available memory. I'm very used to trading off a bit of memory for better performance -- almost unconsciously -- or being a little wasteful because I've got eight cores at my disposal. That's a really bad idea on the iPhone!

The other hard thing is making sure that it's iPhone-y. Making a good app is not just a matter of shrinking the GUI down, you really need to think about presenting the data effectively.

The technical aspects are all pretty much sorted. The unit test side is less advanced than on the Java side. On the other hand I find that I can be much more productive and less error-prone in Objective C than Java, and this is probably due to the object model which is quite different (you tend to delegate rather than inherit).

Stephen Darlington
On delegation vs inheritance, thats a win for me :) I've seen far too much evil done with inheritance, plenty of it by me in the years past!
j pimmel
+5  A: 

A few months ago I was a Java web programmer who hadn't touched C since college. Now I've got one iPhone app completed (for my day job, stuck in the bureaucracy there so it's not in the app store yet) and my second app nearing completion.

To answer your question the biggest hurdles are understanding the conventions (Delegate pattern, Categories, etc.), getting a grasp on memory management, and working with XCode (a good IDE but definitely steps behind Eclipse and IntelliJ).

I also think the documentation in the Apple Developer Center website is well-written, and a good developer can get up and running quickly.

To more specifically answer your question, I haven't tried Unit Testing yet but I think the OOP is great - my domain objects in my iPhone apps are as robust and powerful as those I've written in Java.

bpapa
+2  A: 

For unit testing there are a few options, OCUnit was linked above. There is also google-toolbox-for-mac.

The OOP in objective-c is good, fairly clean. You will encounter old school C functions on occasion as well.

The API used is called Cocoa-Touch, and is built on Cocoa, which was built from NextStep, so there is a great history of design and refinements out there.

No garbage collection on the iPhone. The golden rule is "If you alloc, then you release". There are plenty of questions on SO regarding memory management, so I won't go into details here.

The major hurdle is the design / architecture differences. iPhone apps and java apps are build using different conventions. So consume as much objective-c / cocoa / cocoa-touch code as you can find / stand.

Spend some time working with Interface Builder, it can be aggravating, but that usually means your not understanding what its up to. Once you have a clear view of how IB works, and what it can do for you, you will really appreciate it.

Cocoadev.com is a handy resource for picking up design and code examples.

Cocoadevcentral.com has an excellent collection of articles, including desktop cocoa development. His learn objective-c article is one of the best you will find.

Get an Apple Developer Connection account if you don't have one yet. You don't have to pay for this one, but will get you into the documentation and tools.

ADC iPhone

iPhone Reference Library API Docs, guides, sample code, The official Apple stuff.

Ryan Townshend
+4  A: 

I came out of college as Java developer. My first (real) job was Mac Development. Transitioning from a language I know (my starting point was Java) to something like Objective-C was fairly easy, code-wise. To maximize your time developing iPhone / Mac Applications, you have to make use of XCode and Interface Builder. Once you get the hang of attaching events and GUI outlets (the objects your UI want to communicate with), you'll be set for normal iPhone app development.

Here are the steps I went through learning Objective-C (the programming language for iPhone development) having my Java background:

  1. Learn the basic OC object-oriented concepts. Subclassing (Inheritance), protocols (Java Interfaces), object properties (Bean properties), methods (you have to explicitly indicate the "parameter entry" labels, unlike in C / C++ / Java where you guess the parameter ordering).

  2. Understand the difference between Objective-C, Cocoa, Aqua, and C. Then learn about how to use frameworks. Frameworks are pretty much the same as Java Packages.

  3. Familiarize yourself with using these Foundation classes: NSString, NSArray, NSDictionary, NSSet, NSURL, NSAutoreleasePool.

  4. Study more about Interface Builder. I thought before that the Visual Basic way of programming limits the programmer. I was wrong. It is better you "visualize" the app first before you get the hang of how things go in it. Take note about the keywords IBAction (analogous to making an EventListener), Outlets (you only have a few objects "exposed" for your UI elements), Views (UIView in case of the iPhone, everything that's "visible" in the application can be considered a "view"), and Controllers (there are ready-made controllers that you could use to populate Table Views, flip Card Views, etc.).

  5. Learn how to deploy your app through the iPhone Developer Portal. You cannot send any iPhone app to any device if you don't have this "right". Yeah, I know it sucks, but you have to go through this process, anyway, if you want to sell your apps.

BTW, you could use the following for unit testing iPhone code: iPhone Unit Testing

Hope this one helps. :)

jopes
A: 

It is worth mentioning that you can use C++ and C++ objects within your Objective-C code, often referred to as Objective-C++. This can be a valuable approach to separating your data model and other platform-independent code (written in standard C++) from your UI code (written in Objective-C using the Cocoa framework).

A: 

If you understand the idea of OOP through your Java experience, and if you have a basic idea of what pointers and memory management are, then the last obstacle in your way will be the alien syntax.

Syntax: I found this tutorial, among others, very clear and concise. In my mind, I conceptually mapped Objective-C and Java infrastructure, which you can do for the most part (i.e. a message is for the most part a method, a protocol is an interface, and so forth). Once you get over the initial shock, you will find that Objective-C development for UI applications can be rather intuitive and pleasant.

Structure: I don't program UI so much, so I found that I needed to get a better grasp of the MVC paradigm.

You may also find some cool language features, such as categories, that you wish you had in Java. I likewise find the lack of some other constructs, such as the lack of static members.

Jake