Home > Articles > Programming > C/C++

  • PrintPrint
  • Share ThisShare This
  • DiscussDiscuss
Close WindowDavid Chisnall

David Chisnall 

Learn more…

Web Graphics, Part 3: WebGL
Jul 26, 2010
Web Graphics, Part 2: Scalable Vector Graphics
Jul 19, 2010
Web Graphics, Part 1: The Canvas
Jul 12, 2010
Introducing OpenCL
Jul 6, 2010
Understanding the Cocoa Text System
Jun 28, 2010
Replacing Flash with Cocoa
Jun 23, 2010
Cocoa Programming Fundamentals: UNIX Tools in Cocoa
May 27, 2010
Inside the Symbian Kernel
Apr 26, 2010
IPv6: Why Bother?
Apr 16, 2010
Writing a Good Set of Coding Conventions
Apr 12, 2010
SCTP: Reinventing Internet Communication
Apr 5, 2010
Objective-C for Java Programmers, Part 2
Mar 29, 2010
Objective-C for Java Programmers, Part 1
Mar 12, 2010
Exploring HTML 5
Mar 8, 2010
How to Make Money with Free Software
Mar 8, 2010
Objective-C Design Patterns
Mar 5, 2010
Grand Central Dispatch: Exciting or Overhyped?
Mar 2, 2010
Introducing HTML 5
Feb 15, 2010
The State of Open Source 3D
Feb 9, 2010
What Is Mac OS X?
Feb 5, 2010
Snow Leopard: The Underhyped APIs
Jan 29, 2010
Foundation: The Objective-C Standard Library
Jan 26, 2010
Cocoa Tips: Exposing System Services
Jan 22, 2010
Cocoa Tips: Don't Reimplement Standard Functionality
Jan 15, 2010
Localizing Cocoa
Jan 8, 2010
How Core Animation Changed Cocoa Drawing
Jan 4, 2010
Using Distributed Objects in Cocoa
Jan 1, 2010
Inside Modern X11 Programming
Sep 18, 2009
Making JavaScript Fast, Part 2
Sep 15, 2009
Security in Your Pocket: OpenBSD on ARM
Sep 11, 2009
Making JavaScript Fast, Part 1
Sep 8, 2009
The Failure of the GPL
Aug 31, 2009
How Not To Optimize
Aug 21, 2009
A Half-Way Step to Apple’s Source Code: An Interview with David Chisnall
Jun 5, 2009
Advanced Flow Control for Objective-C
Jun 5, 2009
Erica Sadun on the iPhone SDK, OS X, and the Computing Landscape
Jun 5, 2009
From NeXTSTEP to Cocoa: Erik Buck on the Development of Cocoa and Objective-C
Jun 5, 2009
Fun with the Objective-C Runtime
Jun 5, 2009
Marcus Zarra and Matt Long on Core Animation
Jun 5, 2009
Steve Kochan on the Evolution of Objective-C
Jun 5, 2009
The Technology NeXT Gave the World
Jun 5, 2009
Where the Web and the Desktop Meet: An Interview with Lee Barney
Jun 5, 2009
Pandora: An Open Console
Jun 2, 2009
The Future of Wireless Networking
May 15, 2009
GNU or Linux?
May 11, 2009
Debugging C-Family Languages
Mar 27, 2009
How Small Is Your PC? The Rise of Netbooks and Other Small Form-Factor PCs
Mar 23, 2009
David Chisnall's CPU Feature Wishlist
Mar 13, 2009
The Dynamic Languages Renaissance
Jan 30, 2009
Robert Seacord on the CERT C Secure Coding Standard
Dec 15, 2008
Objective-C for C++ Programmers, Part 3
Nov 21, 2008
Objective-C for C++ Programmers, Part 2
Nov 14, 2008
Objective-C for C++ Programmers, Part 1
Nov 7, 2008
Writing Insecure C, Part 3
Oct 24, 2008
Writing Insecure C, Part 2
Oct 17, 2008
Writing Insecure C, Part 1
Oct 10, 2008
iRex iLiad e-Reader: Linux's Answer to the Kindle?
Aug 29, 2008
How It Works: Filesystems
Jun 13, 2008
How the LLVM Compiler Infrastructure Works
May 23, 2008
How It Works: Virtual Memory
May 21, 2008
What Is C For?
May 16, 2008
The Future of eBooks
Apr 25, 2008
Imagining an Open Network
Apr 18, 2008
Understanding How Xen Approaches Device Drivers
Mar 21, 2008
Examining the Legendary HURD Kernel
Mar 14, 2008
Competition Among Open Source Compilers
Feb 1, 2008
Inside Your OS: What is a Process Scheduler, and How Does it Work?
Jan 25, 2008
Bad UI of the Week: Read This (OK/Cancel)
Jan 18, 2008
The End of the Desktop Era
Jan 11, 2008
The What and Why of Open IM
Dec 28, 2007
A Look at the Modern X Server
Dec 21, 2007
The Future of Digital Media
Dec 14, 2007
The Future of Identity
Dec 7, 2007
Bad UI of the Week: Ask Forgiveness, Not Permission
Nov 21, 2007
Copyright Versus Free Software
Nov 16, 2007
Is Computer Science Dying?
Nov 9, 2007
A Brief History of Programming, Part 2
Nov 2, 2007
A Brief History of Programming, Part 1
Oct 26, 2007
The 700MHz Question: Will the Wireless Spectrum Auction Lead to Innovation or More of the Same?
Sep 28, 2007
Bad UI of the Week: The Menu Bar
Aug 24, 2007
The Dark Corners of x86
Aug 17, 2007
Bad UI of the Week: The Cross-Platform User Interface
Aug 17, 2007
Bad UI of the Week: The Mythical "is Like" Operator
Aug 10, 2007
Bad UI of the Week: Don't Make Me Tell You Twice...
Aug 3, 2007
Bad UI of the Week: Kettles and Washing Machines
Jul 27, 2007
The BBC iPlayer Controversy Explained
Jul 20, 2007
Bad UI of the Week: The Mitten Mouse
Jul 20, 2007
Bad User Interface of the Week: File It Under “Bad”
Jul 13, 2007
Bad User Interface of the Week: The DVD
Jul 6, 2007
A Roundup of Free Operating Systems
Jun 22, 2007
DragonFly BSD: UNIX for Clusters?
Jun 15, 2007
CPU Wars, Part 3: Put Your Left ARM In
May 18, 2007
CPU Wars, Part 2: POWER to the People
May 11, 2007
CPU Wars, Part 1: When the Chips Are Down
May 4, 2007
ZFS Uncovered
Apr 6, 2007
Vector Programming with GCC
Mar 30, 2007
Free Software Versus Open Source Software
Mar 16, 2007
What Programming Languages Should You Know?
Mar 9, 2007
Standardizing UNIX
Feb 2, 2007
Prolog: Logic Programming for Rapid Development
Jan 26, 2007
POSIX Parallel Programming, Part 3: Threads
Jan 19, 2007
POSIX Parallel Programming, Part 2: Message Passing
Jan 12, 2007
POSIX Parallel Programming, Part 1
Jan 5, 2007
The Nokia 770 Revisited
Dec 29, 2006
The Open Source Desktop Myth
Dec 22, 2006
Separating Style and Content: LaTeX and Typesetting
Dec 1, 2006
GNUstep: A Free Software alternative to OpenStep
Nov 10, 2006
Behind the Scenes of Objective-C 2.0
Nov 3, 2006
The Future of CPUs: What's After Multi-Core?
Oct 27, 2006
What Makes a Good Programming Language?
Oct 20, 2006
Emulation: Role-Playing for Computers
Oct 13, 2006
NetBSD: Not Just for Toasters
Oct 6, 2006
POSIX Asynchronous I/O
Sep 22, 2006
Breaking Down GPL Version 3
Aug 18, 2006
The Role of Binary Drivers in a Free OS
Aug 4, 2006
Security Is a UI Problem
Jul 28, 2006
Debunking the Myth of High-level Languages
Jul 14, 2006
A Taste of Erlang, a Dynamic, Asynchronous Message-Passing Language
Jun 30, 2006
Alternatives to LAMP
Jun 2, 2006
BSD Packaging Systems
May 26, 2006
DRM: Digital Rights or Digital Restrictions?
May 4, 2006
Introducing OpenBSD 3.9
Apr 28, 2006
The Need for Virtualization and Xen
Mar 31, 2006
Making Effective Software TCO Calculations
Mar 24, 2006
10 Things I Hate About U(NIX) Revisited: Readers Speak
Mar 17, 2006
Comparing Open Source Licenses: GPL vs. BSDL
Feb 3, 2006
BSD: The Other Free UNIX Family
Jan 20, 2006
Measuring the Effectiveness of Application Security Policies
Jan 13, 2006
The Cost of Free Software
Dec 9, 2005
Nokia 770 Internet Tablet Week-long Test Drive
Nov 18, 2005
10 Things I Hate About (U)NIX
Nov 4, 2005
The Lure of Open Source Software: Why Consider It for Your Business?
Oct 14, 2005
Cocoa Tip of the Day, 1/29/10
By on January 29, 2010 No Comments

Don't ignore old versions of OS X.

Cocoa Tip of the Day, 1/28/10
By on January 28, 2010 No Comments

Exceptions should be exceptional.

Cocoa Tip of the Day, 1/27/10
By on January 27, 2010 No Comments

Explore the runtime system.

Cocoa Tip of the Day, 1/26/10
By on January 26, 2010 No Comments

Copy design patterns from Cocoa.

Cocoa Tip of the Day, 1/25/10
By on January 25, 2010 No Comments

Profile with Instruments.

Cocoa Tip of the Day, 1/22/10
By on January 22, 2010 No Comments

Expose system services.

Cocoa Tip of the Day, 1/21/10
By on January 21, 2010 No Comments

Always read the release notes for new OS X versions.

Cocoa Tip of the Day, 1/20/10
By on January 20, 2010 No Comments

Broadcast events with notifications.

Cocoa Tip of the Day, 1/19/10
By on January 19, 2010 No Comments

Port your code with GNUstep.

Cocoa Tip of the Day, 1/18/10
By on January 18, 2010 No Comments

Use CoreAnimation for caching.

Cocoa Tip of the Day, 1/15/10
By on January 15, 2010 No Comments

Don't recreate standard features.

Cocoa Tip of the Day, 1/14/10
By on January 14, 2010 No Comments

Don't forget NSCell.

Cocoa Tip of the Day, 1/13/10
By on January 13, 20102 Comments

Plan for code reuse.

Cocoa Tip of the Day, 1/12/10
By on January 12, 2010 No Comments

Remember the C in Objective-C.

Cocoa Tip of the Day, 1/11/10
By on January 11, 2010 No Comments

Separate interfaces and implementations.

Cocoa Tip of the Day, 1/8/10
By on January 8, 2010 No Comments

Think about localisation early.

Cocoa Tip of the Day, 1/7/10
By on January 7, 2010 No Comments

Read the Human Interface Guidelines.

Cocoa Tip of the Day, 1/6/10
By on January 6, 2010 No Comments

Don't optimise yet.

Cocoa Tip of the Day, 1/5/10
By on January 5, 2010 No Comments

Put controllers in nib files.

Cocoa Tip of the Day, 1/4/10
By on January 4, 2010 No Comments

Don't write code.

Cocoa Tip of the Day, 1/1/10
By on January 1, 2010 No Comments

Use Distributed Objects for local network communication.

Programming in Objective-C

Like this article? We recommend
Programming in Objective-C

The Future

Apple is traditionally very tight-lipped about future products. For example, the Leopard preview site has very few details on the new features added to Objective-C. In recent years, however, Apple has tried hard to "play nice" with the Free Software community—in particular, by minimizing the divergence of the Apple version of the GCC from the main branch. At any point, however, a number of patches haven’t made it into the main tree. For this reason, Apple has its own branch in the GNU CVS repository.

Since Apple’s GCC development branch is public, it’s possible to poke around in it and see what the Apple developers are up to. This isn’t an endeavor for the faint-hearted; the GCC codebase is not the easiest to understand at the best of times. Wouldn’t it be easier if there were a set of simple example programs showing the new features? Well, I closed my eyes and wished hard, and the magical code pixies delivered this link for the Objective-C test suite in the Apple branch. Every new feature has a simple example program used to test functionality. All you need to do is compile them.

If only life were that simple.

While Apple’s Objective-C compiler is Free Software (due to being a branch of the GNU compiler), Apple’s Objective-C runtime library is not. Not only is it not Free Software—the version required by Objective-C 2.0 isn’t released yet. While it’s possible to compile these programs, some of them won’t link, and most of them won’t work. Still, it’s possible to get an idea of what they do, even without compiling.

Garbage Collection

Pretty much any Objective-C programmer will tell you that the one feature he really misses when using Objective-C is garbage collection. OpenStep uses a retain/release reference-counting mechanism that works most of the time, but is sometimes difficult to use (for example, with data structures containing loops).

Garbage collection in Objective-C isn’t exactly new. Tiger shipped with a compiler supporting garbage collection, and the main GNU trunk has supported the Boehm Garbage Collector for a while. The problem is largely with the standard libraries, which must be modified to support garbage collection.

Objective-C 2.0 adds __strong and __weak type qualifiers for pointers. These qualifiers control whether the compiler should notify the runtime garbage collector of assignments to pointers. A pointer defined at __strong will cause garbage collection events to be generated for all events. The __weak qualifier is redundant in declarations (__weak is the default), but it can be used to suppress the generation of garbage collection events by casting a pointer to a __weak pointer before assignment.

Examples of the use of these features can be found in the objc-gc-*.m test cases.

Loose Protocol Definitions

A protocol is a strict formal definition of an interface to a class. Any class that adopts a protocol must implement it. But sometimes you don’t need all of the methods in an interface. You may want to specify a core set of methods as well as a set of convenience methods that might allow more efficiency, but aren’t absolutely required.

The new @optional and @required keywords permit this flexibility. Any method in a protocol defined as @required behaves like a method in a traditional Objective-C protocol; all classes that adopt the protocol must implement it. @optional methods are advisory; they’re ones that a class can implement, but doesn’t have to. A string class, for example, might be required to provide methods for inserting and removing objects at a specific location, but may also provide a method for replacing a character, which would be more efficient than inserting and deleting as two separate operations.

Examples of the use of these keywords can be found in the enhanced-proto-*.m test cases.

Concrete Protocols

Objective-C, just like Smalltalk, doesn’t have multiple inheritance. This was a design decision, as it was with Java, because multiple inheritance can cause headaches. Instead, Objective-C has categories, which allow methods to be added to an existing class, and protocols that specify interfaces.

Objective-C 2.0 adds the concept of a concrete protocol. Whereas a protocol is a definition of an interface, a concrete protocol adds some implementation detail as well. If the class that adopts the protocol doesn’t provide its own implementation, it will get the default implementation from the protocol.

These features can be combined effectively with @optional methods in a protocol to provide a default implementation of @optional methods, but allow an implementer to replace them with a more useful method.

Method Attributes

A while ago, the GCC added function attributes to C. These are specified using __attribute__ in the function declaration, and provide some extra metadata to the compiler. The uses of function attributes can be divided into two cases:

  • Optimization hints tell the compiler to do things such as pass some parameters in registers, or reuse results when the same function is called with the same arguments.
  • Coding hints are used to generate warnings when a function is invoked.

Most of the optimization hints don’t make sense in the context of Objective-C methods, since they’re invoked via the objc_msgSend function. The coding hints do make sense, however. Objective-C 2.0 adds support for deprecated and unavailable attributes. If a program calls methods marked with either of these descriptions, the compiler will emit a warning suggesting that the method not be used.

Examples of these options can be found in the method-attribute-*.m test cases.

Properties

One nice feature of recent versions of Objective-C is key-value coding, which provides an abstracted interface to getting and setting instance variables. Instance variables are accessed via the objectForKey: method, which calls the correct get method, returns the instance variable, or calls a default handler.

Objective-C 2.0 takes this arrangement a step further with properties. Conceptually similar to public instance variables, properties are more clever. The declaration of a property looks like this:

@property int aProperty;

This syntax provides nice encapsulation, since it gives no information about how the property is accessed. In the implementation section, you might have something like this:

@property (ivar = anInstanceVariable, copies, setter = aSetMethod:) int aProperty;

This would (I believe) return a copy of anInstanceVariable when someone tried to read the property, and invoke the aSetMethod method when it was set. Properties are accessed using the following syntax:

anObject.aProperty = 2;

This is a new syntactic addition to Objective-C objects. Instance variables are accessed using ->, since objects are always handled via pointers. However, it’s consistent with the separator used in key-value coding paths.

Note that property names must be distinct from instance variable names, or an error will be generated.

The test cases related to properties are named property-*.m.

For Each

When you want to iterate over the elements in a collection in Objective-C, you typically create an enumerator and use that. Because this is something that’s commonly done, I wrote a macro to reduce the number of copy-and-paste errors:

#define FOREACH(collection,object,type) FOREACHE(collection,object,type,object ## enumerator)
#define FOREACHE(collection,object,type,enumerator)NSEnumerator * enumerator = [collection objectEnumerator];type object;IMP next ## object ## in ## enumerator = [enumerator methodForSelector:@selector(nextObject)];while((object = next ## object ## in ## enumerator(enumerator,@selector(nextObject))))

This works quite well, and gains a little bit of speed by caching the instance method pointer for the nextObject method in the enumerator. To log every string in an array, you would use it as follows:

FOREACH(anArray, string, NSString*)
{
  NSLog(@"%@", string);
}

Objective-C 2.0 adds a new for statement construct for doing this. Here’s the equivalent code in Objective-C 2.0:

for(NSString * string in anArray)
{
  NSLog(@"%@", string);
}

The most interesting thing about this is that it doesn’t work on any of the standard collections without modification. It depends on the existence of a method with the following signature:

- (unsigned int)countByEnumeratingWithState:(struct __objcFastEnumerationState *)state objects:(id *)items count:(unsigned int)stackcount;

It’s not immediately obvious why Apple chose this path, since the existing enumerator framework allows this functionality without modification to existing code. Inspecting the __objcFastEnumerationState structure doesn’t provide much more insight, so I poked a little deeper. For reference, the code related to handling the for each statement is found in gcc/objc/objc-act.c.

The for each loop invokes this method to get a C array of up to 16 elements at a time. These are returned via items, and the return value of the method contains the number of elements in the array. All quite simple so far—and a significant efficiency increase, since you need only one method call per 16 elements. In the simple case, the following are roughly equivalent:

for(type element in collection)
{
  //Do Something
}

and

type element;
struct __objcFastEnumerationState state = { 0 };
id items[16];
unsigned long limit
while((limit = [collection countByEnumeratingWithState:&state
            objects:items
             count:16]))
{
  for(unsigned int i=0 ; i<limit ; i++)
  {
    element = items[i];
    //Do Something
  }
}

This is not quite accurate, though. In cases where the data is stored internally in a C array, the object can return a pointer to that array in state.itemsPtr to avoid copying. In other cases, it sets state.itemsPtr to items and copies the requisite pointers into items.

Tantalizing, however, is the fact that the objc_enumerationMutation() is called in cases where subsequent calls to countByEnumeratingWithState:objects:count change the value of the long integer pointed to by state.mutationsPtr. Unfortunately, objc_enumerationMutation() is a runtime library function that doesn’t exist in published versions of the library, so it’s unclear exactly what it does.

  • Share ThisShare This
  • Your Account

Discussions

Preprocessors.
Posted Oct 30, 2007 07:59 AM by dw1560
0 Replies

Make a New Comment

You must log in in order to post a comment.

Related Resources

 Big Nerd RanchAsk Big Nerd Ranch: Blocks in Objective-C
By Big Nerd Ranch on June 24, 2010 No Comments

Adam Preble answers a question about blocks.

Danny KalevYves Smith: Suspicions that The Fed is manipulating Wall Street
By Danny Kalev on May 24, 2010 No Comments

Yves Smith, the nom de plume of the creator of Naked Capitalism and one of the most savvy and respected members of the blogosphere. In professional life Yves is known as Susan Webber. Yves recently gave an interview to an Israeli financial newspaper in which she claims that a federal team unofficially called "the plunge protection team" is manipulating the stocks on Wall Street.

 Big Nerd RanchAsk Big Nerd Ranch: Rotating an iPhone View Around a Point
By Big Nerd Ranch on May 20, 2010 No Comments

Brian Hardy answers a question about view rotation.

Sample code for this article is available in the Big Nerd Ranch github repository. The sample application demonstrates several techniques illustrated here, and works on iPhone or iPad.

Q. On iPhone OS, how can I rotate a view around an arbitrary point?

A. By default, views in Cocoa Touch (and Cocoa) are configured to rotate around their center point. While this is commonly useful (think of a UIActivityIndicatorView), often you will want to use a point other than the center. There are (at least) two ways of doing this. You can change the anchorPoint property of the view's layer. Alternatively, you can wrap the view in a superview, with the superview's center located at the point you want to rotate around. In either case, the mechanism for rotation is the same. Both techniques are discussed here.

See All Related Blogs

Informit Network