Objective-C: the More Flexible C++

An introduction to Objective-C for programmers familiar with C++ or any other OOP language.

It is a surprising fact that anyone studying GNUstep or the Cocoa Framework will notice they are nearly identical to the NEXTSTEP APIs that were defined ten years ago. A decade is an eternity in the software industry. If the framework (and its programming language--Objective C) came through untouched these past ten years, there must be something special about it. And Objective-C has done more than survive; some famous games including Quake and NuclearStrike were developed using Objective-C.

Why Should I Learn Objective-C?

Objective-C gives you the full power of a true object-oriented language with exactly one syntax addition to C and, unlike C++, about a dozen additional keywords.

Since Apple purchase Next for $400 million and Mac OS X ships with Objective-C, recycling NEXTSTEP (later called OpenStep), as well as the fact that GNUstep is delivering the rock-solid window-manager Window Maker, Objective-C is (rightly) getting more attention because it is more flexible than C++ at the cost of being slower.

In reality, Objective-C is Object C and is as close to Smalltalk as a compiled language can be. This is no surprise as Brad J. Cox added object-oriented, Smalltalk-80-based extensions to the C language.

So objective-C is a hybrid between Smalltalk and C. A string can be represented as a `char *' or as an object, whereas in Smalltalk everything is an object. As with Java (int, double,.. are no objects) this leads to faster performance.

In contrast, C++ traditionally is associated with the Simula 67 school of object-oriented programming. In C++, the static type of an object fixes what messages it can receive. In Objective-C the dynamic type of an object determines what messages it can receive. The Simula 67 format allows problems to be detected at compile time. The Smalltalk approach delays typing until runtime and therefore is more flexible.

A GNU version was written by Dennis Gladding in 1992 and then Richard Stallman took over the development. The current GNU version is derived from the version written by Kresten Thorup when he was a still a university student in 1993. He ported that version to the NeXTcube and joined NeXT.

Apple chose Objective-C for Cocoa, as NEXTSTEP was based on Objective-C. But, even if they had written it from scratch, they might have decided to use Objective-C because it is object-oriented, which is undoubtedly a must for big software projects. It extends the standard ANSI C, so that existing C programs can be adapted to use the frameworks, and programmers can chose when to stick to procedural programming and when to go the object-oriented way. C was intended to be a good language for system programming. C is fine as it allows the programmer to do exactly what she wants, all the way down to the hardware. C also keeps the gold old pointers, which can be used for efficient code.

Objective-C is simple, unambiguous and easy to learn. But most of all, it is the most dynamic language of all object-oriented languages based on C. Its dynamic late binding offers flexibility and power. Messages are not constrained by either the class of the receiver or the method selector, allowing rapid change and offering access to information about running applications.

The following is a short introduction to OOP in Objective-C, starting with the basics. Procedural programs consist of data and operations on data. OOP works at a higher level by grouping data into units, which are called objects. Several objects combined and their interactions form a program.

Interface and Implementation

Abstraction is at the root of all understanding; it helps us capture the bigger image as the details are hidden. Object-Oriented Programming and the Objective-C Language (see Resources) shows the image of a clock cut half-open: what we normally see (the external view) is the interface, and the implementation (the internal workings) is hidden inside.

@interface declares a new class. It indicates the name of the class and its superclass, the protocols adhered to, the layout of the instance variables and declares the methods implemented by this class. Traditionally a class interface is stored in a file called <classname>.h.

Only externally visible methods are listed in the interface section. However, there are visibility keywords for instance variables:

  • @private: the instance variable is accessible only within the class that declares it.

  • @protected: the instance variable is accessible within the class that declares it and with the class that inherits it.

  • @public: the instance variable is accessible everywhere.

  • @implementation' defines a class. The implementation is a collection of method definitions stored in a file called <classname>.m.



Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

Re: Objective-C: the More Flexible C++

dankelley's picture

Some thoughts from a scientist who also dabbles in software creation:

my 2 cents Canadian (not much in othe terms, lately) worth...

Some years ago, I wrote a pretty large (10^4 lines) open-source code

in C. It became apparent that it would help for this code to have

parts that were more object-oriented, and so I read a bit and decided

to convert those parts.

During this work, I learned that objC is quite beautiful. By that, I

mean that the code, and the logic it inspired, was elegant to the eye,

in the way that some mathematics proofs can be.

But one day I realized that none of the folks using this code knew

objective-C, whereas many of them knew C++. Since this was a shared

program, I wanted my users to be able to contribute to the work. And

so I started the process of converting the objective-C into C++. That

was not much fun, partly because the syntax is different and partly

because C++ seems not to inspire the writing of elegant code (or,

better stated, it seems not to inspire the construction of elegant


Why is this, exactly? I'm not sure. At first I thought my distaste

for C++ might be just a love of the old. But, now I've been using C++

for years, and I can read/write it much more easily than objective-C,

and I still feel the same way.

In summary, the advantage of objective-C seems to be that it inspires

an elegance of expression. The disadvantage is that fewer people can

read your code.

Of course, all of this may be moot, since it's my

understanding that many students are learning Java before they learn

any of the C dialects. Maybe I'm getting too old to keep up ... I

just get used to Perl and Python comes along like a knight in shining

armor, and before I learn it, I hear that now Ruby rules!


Re: Objective-C: the More Flexible C++

Anonymous's picture

You're right. Obj-C done right is MUCH more elegant than anything else.

Of course, you have to get into the "mood" to do it right. Just applying the "old habits" (C++ etc.) won't work.

Where Objective-C shines is that it leads to truly reusable code. Just comparing the number of classes in a typical C++ library and within Objective-C shows that.

This is not surprising at all: most C++ or Java windowing libraries (like PowerPlant on Mac, MFC on Windows) are anyway just bad copies of the NextStep classes. Their quality only differs how much thought they put into the classes to reassemble the functionality of Objective-C in the choosen language.

so - why not choose the original first?

Learning the syntax is something like 2 days for a C programmer. The tough part is getting the own classes right. But once its understood, there is nothing like it anywhere.

I've written for 10 years in C and C++ and it was always messy and at the end no fun at all. After switching to Obj-C the only thing I regret is not buying a NextStep Station in the 90ies...


Objective-C---more than just games

WillAdams's picture

Macromedia FreeHand (v4) started as Altsys Virtuoso on NeXTstep.

Improv--Although there was an Improv 2 for Windows, it was never quite as nice

as Improv for NeXTstep (which also fell far short of where it ought to've

been), but there's still no widely available spreadsheet available now which

handles 3D data so elegantly AFAIK.

Then, one could compare the programs which are all but without peer, for

example TIFFany (PhotoShop on steroids), or PasteUp.app (developed almost

single-handedly by Glenn Reid in roughly a year). Or, MCI's Friends and Family

database system (they liked it so much, they bought the company!)

NeXTstep is also the premiere platform for using PostScript directly and

interactively---Alan Hoenig praises it in his book _TeX Unbound_

SoftMagic, www.softmagic.co.kr is an incredible product.

And of course, there's WebObjects....

Lastly, Tim Berners-Lee used NeXTstep (he crafted a thing called worldwideweb.app---guess what it

grew into)


Re: Objective-C: the More Flexible C++

Anonymous's picture

Hey, you cannot blame C++ for introducing new keywords and propose a language that overloads every special character on the planet :)

I dont want to say that Objective C is bad or something. But don't try to make a thing better by complaining about another thing.

Beside that, C++ is not only "C with Objects". It has many other useful features, like templates or references. Maybe it would be a good idea to think about mixing C++ and Objective C, creating a "Objective C++" that combines Objective C's runtime system with all the C++ features (and the more popular syntax of C++). As you can see, I am not a proponent of the 'make a language as simple as possible' school, but I rather prefer the 'add every single feature that can not be implemented in a lib, because every feature helps the programmer who works 100h a week in the damn language' school...

Re: Objective-C: the More Flexible C++

Anonymous's picture

Objective-C++ already exists! NeXT extended Objective-C in this way to leverage C++ into NeXTSTEP applications (if the solution already exists in C++ why not use that). It turns out that Objective-C++ is probably only useful for that purpose, the features in C++ have a heavy cost in readability and ease of use, so Objective-C++ isn't used much. Objective-C turns out to prove that K&R were right to keep C a small language. :-)

Re: Objective-C: the More Flexible C++

Anonymous's picture

As you can see, I am not a proponent of the 'make a language as simple as possible' school, but I rather prefer the 'add every single feature that can not be implemented in a lib, because every feature helps the programmer who works 100h a week in the damn language' school...

And it is thinking like that to cause C++ compilers to never be able to totally implement the C++ language specifications. The compiler makers have a hard time trying to implement these "features". I always get frustrated to write a program using valid C++ and it compiles and runs fine on one platform and try to compile it on another(VC++) and have either totally rewrite that part of code or do some conditional compilation that makes the code hard to read. I like C++ and wish a few of the very useful features like namespaces would be added to Objective-C. I am totally against templates being added since it is against the philosphy of a dynamic OO language.

A simpler language allows you to move on and start writing code to do some work. I was able to learn Objective-C in a few days and I understand the entire language. I been programming in C++ for 5 years and I still do not know the language.

Re: Objective-C: the More Flexible C++

Anonymous's picture

> I was able to learn Objective-C in a few days and I understand the entire language.

Just Understand the language is not enough, Apply them practical will tell.

> I been programming in C++ for 5 years and I still do not know the language.

Are you work as a professional programmer for a competitive company or non professional just writing some simple app as hobby or in goverment org that use & waste tax-payer money ?

Nowaday, all OOP similar to C++, include JAVA, C#, VB.NET etc. If you cannot understand C++, you cant understand thiese language as well.

If you are a professional programmer, esp in competitive company, you are already fired (for failed to know the language).

Other comment is, C++ Template (Now C#/VB dot.net also support similar features called "generic") is "good to have", but is NOT "must have", it can improve the reusability and flexibilty very much, esp like map, list, stack etc.(standard template library)
Nevertheless, You do NOT need to explicitly write C++ template to qualify as "C++ programmer". Many professional C++ programmer never write their own template. (template is not so easy to read, but very easy to use).

Many developer likes to make use of some language features just purely because of "the language have this features - I MUST use it", or to show-case there are the pro. , without considering practically, case by case suitability and portability. (ie, "good to have" vs "must have").

Not using template, does not disqualify you as C++ Programmer, But Not even have a basic understand of it, may disqualify you as C++ programmer).

What language to use, and their understanding of the language, depend on the programmer computer-science knowledge also, of-course we cannot expect, for someone study archeology to code in C++. But for those have strong Computer-Science background, C++ is just as easy as A B C.

BTW, I self study OOP generally, C++ specifically. (my school deos not not teach us C++ at that time). I can "understnad" it in few days also, cannot imaging there is someone cannot understand it after 5 years !

Re: Objective-C: the More Flexible C++

Anonymous's picture

Objective C++ already "exists"...

Re: Objective-C: the More Flexible C++

Anonymous's picture

And this does not look like C.

No wonder people adopt C++ instead of Objective-C.

Re: Objective-C: the More Flexible C++

Anonymous's picture

In my opinion, part of C++'s problem is that it looks TOO MUCH like C. This, I think, encourages confusion among beginners and the tendency to write C code, not OO code, with C++.

IMHO, a method call is inherently different from a function call - especially in a dynamic system like ObjC, and should have its own notation distinct from that of a function call.

Likewise, an object is inherently different from a structure, and the notation should be different. Etc.

I much prefer ObjC's [foo bar:1 with:me];

syntax, because it is quite clear that this is an OO construct, and different from all the C code that might surround it.

Without OOP knowledge, not look too much like.

Anonymous's picture

> In my opinion, part of C++'s problem is that it looks TOO MUCH like C. This, I think, encourages confusion among beginners and the tendency to write C code, not OO code, with C++.

Programmer without OOP concept and skill, will write in structured manner given whatever OOP language to them.

for eg, if the code is written by non OOP/C++ programmer, there actually write in 'C' only, wrapped, or saved in .cpp or .cc files.

.cpp or .cc save file does NOT mean it is C++ code. keep in mind.

For those programmer, There are not C++ beginners, but OOP beginner or totally have no idea of what is OOP.

If you given them Obj-C capable compiler, there will also write their code in C only code, wrapped / saved in .m files - nothing to do with "look too much like".

Re: Objective-C is definitely superior to C++

Anonymous's picture

I totally agree with you...

Who does not agree with the title either does not know the language or is a moron (no pun intended)

On the other hand, I believe Objective-C lacks a couple of important features that C++ has (namespaces and templates among them), but I found that it is still an excellent language even without those...


You can always mix both languages with Objective-C++

Once I read an article by Tim Sweeney (creator of UT) where he analysed programming languages (or something like that)... he stated that in the future, languages will have features to make class hierarchies "extensible" (I can't remember the exact words)... Obj-C is already capable to do that and with trivial effort (and dynamically: you can "override" any class you find with your own version)

Re: Objective-C: the More Flexible C++

Anonymous's picture

why don't your use [[List alloc] init] to create an object? You used [List new]. But you said:

Usually, you create objects with a call to alloc:

Very confusing.

Re: Objective-C: the More Flexible C++

Anonymous's picture

new is a short cut.

[Object new]

is equivalent to

[[Object alloc] init]

Re: Objective-C: the More Flexible C++

Anonymous's picture

new is just a "shorthand" method used in GNUStep:

- (id) new


return [[self alloc] init];


Method new might not actually be (not sure) the one above but surely it does the same as above (conceptually)