You are previewing iOS 5 Programming Cookbook.

iOS 5 Programming Cookbook

Cover of iOS 5 Programming Cookbook by Vandad Nahavandipoor Published by O'Reilly Media, Inc.
  1. iOS 5 Programming Cookbook
    1. SPECIAL OFFER: Upgrade this ebook with O’Reilly
    2. A Note Regarding Supplemental Files
    3. Preface
      1. Audience
      2. Organization of This Book
      3. Additional Resources
      4. Conventions Used in This Book
      5. Using Code Examples
      6. We’d Like to Hear from You
      7. Safari® Books Online
      8. Acknowledgments
    4. 1. The Basics
      1. 1.0. Introduction
      2. 1.1. Creating a Simple iOS App in Xcode
      3. 1.2. Understanding Interface Builder
      4. 1.3. Compiling iOS Apps
      5. 1.4. Running iOS Apps on the Simulator
      6. 1.5. Running iOS Apps on iOS Devices
      7. 1.6. Packaging iOS Apps for Distribution
      8. 1.7. Declaring Variables in Objective-C
      9. 1.8. Allocating and Making Use of Strings
      10. 1.9. Comparing Values in Objective-C with an If Statement
      11. 1.10. Implementing Loops with For Statements
      12. 1.11. Implementing While Loops
      13. 1.12. Creating Custom Classes
      14. 1.13. Defining Functionality for Classes
      15. 1.14. Defining Two or More Methods with the Same Name
      16. 1.15. Allocating and Initializing Objects
      17. 1.16. Adding Properties to Classes
      18. 1.17. Moving From Manual Reference Counting to Automatic Reference Counting
      19. 1.18. Typecasting with Automatic Reference Counting
      20. 1.19. Delegating Tasks with Protocols
      21. 1.20. Determining Whether Instance or Class Methods Are Available
      22. 1.21. Determining Whether a Class Is Available at Runtime
      23. 1.22. Allocating and Making Use of Numbers
      24. 1.23. Allocating and Making Use of Arrays
      25. 1.24. Allocating and Making Use of Dictionaries
      26. 1.25. Allocating and Making Use of Sets
      27. 1.26. Creating Bundles
      28. 1.27. Loading Data From the Main Bundle
      29. 1.28. Loading Data From Other Bundles
      30. 1.29. Sending Notifications with NSNotificationCenter
      31. 1.30. Listening for Notifications Sent From NSNotificationCenter
    5. 2. Implementing Controllers and Views
      1. 2.0. Introduction
      2. 2.1. Displaying Alerts with UIAlertView
      3. 2.2. Creating and Using Switches with UISwitch
      4. 2.3. Picking Values with UIPickerView
      5. 2.4. Picking the Date and Time with UIDatePicker
      6. 2.5. Implementing Range Pickers with UISlider
      7. 2.6. Grouping Compact Options with UISegmentedControl
      8. 2.7. Presenting and Managing Views with UIViewController
      9. 2.8. Implementing Navigation with UINavigationController
      10. 2.9. Manipulating a Navigation Controller’s Array of View Controllers
      11. 2.10. Displaying an Image on a Navigation Bar
      12. 2.11. Adding Buttons to Navigation Bars Using UIBarButtonItem
      13. 2.12. Presenting Multiple View Controllers with UITabBarController
      14. 2.13. Displaying Static Text with UILabel
      15. 2.14. Accepting User Text Input with UITextField
      16. 2.15. Displaying Long Lines of Text with UITextView
      17. 2.16. Adding Buttons to the User Interface with UIButton
      18. 2.17. Displaying Images with UIImageView
      19. 2.18. Creating Scrollable Content with UIScrollView
      20. 2.19. Loading Web Pages with UIWebView
      21. 2.20. Presenting Master-Detail Views with UISplitViewController
      22. 2.21. Enabling Paging with UIPageViewController
      23. 2.22. Displaying Popovers with UIPopoverController
      24. 2.23. Displaying Progress with UIProgressView
      25. 2.24. Listening and Reacting to Keyboard Notifications
    6. 3. Constructing and Using Table Views
      1. 3.0. Introduction
      2. 3.1. Instantiating a Table View
      3. 3.2. Assigning a Delegate to a Table View
      4. 3.3. Populating a Table View with Data
      5. 3.4. Receiving and Handling Table View Events
      6. 3.5. Using Different Types of Accessories in a Table View Cell
      7. 3.6. Creating Custom Table View Cell Accessories
      8. 3.7. Displaying Hierarchical Data in Table Views
      9. 3.8. Enabling Swipe Deletion of Table View Cells
      10. 3.9. Constructing Headers and Footers in Table Views
      11. 3.10. Displaying Context Menus on Table Views Cells
      12. 3.11. Moving Cells and Sections in Table Views
      13. 3.12. Deleting Cells and Sections From Table Views
    7. 4. Storyboards
      1. 4.0. Introduction
      2. 4.1. Creating a Project with Storyboards
      3. 4.2. Adding a Navigation Controller to a Storyboard
      4. 4.3. Passing Data From One Screen to Another
      5. 4.4. Adding a Storyboard to an Existing Project
    8. 5. Concurrency
      1. 5.0. Introduction
      2. 5.1. Constructing Block Objects
      3. 5.2. Accessing Variables in Block Objects
      4. 5.3. Invoking Block Objects
      5. 5.4. Dispatching Tasks to Grand Central Dispatch
      6. 5.5. Performing UI-Related Tasks with GCD
      7. 5.6. Performing Non-UI Related Tasks Synchronously with GCD
      8. 5.7. Performing Non-UI Related Tasks Asynchronously with GCD
      9. 5.8. Performing Tasks After a Delay with GCD
      10. 5.9. Performing a Task Only Once with GCD
      11. 5.10. Grouping Tasks Together with GCD
      12. 5.11. Constructing Your Own Dispatch Queues with GCD
      13. 5.12. Running Tasks Synchronously with Operations
      14. 5.13. Running Tasks Asynchronously with Operations
      15. 5.14. Creating Dependency Between Operations
      16. 5.15. Creating Timers
      17. 5.16. Creating Concurrency with Threads
      18. 5.17. Invoking Background Methods
      19. 5.18. Exiting Threads and Timers
    9. 6. Core Location and Maps
      1. 6.0. Introduction
      2. 6.1. Creating a Map View
      3. 6.2. Handling the Events of a Map View
      4. 6.3. Pinpointing the Location of a Device
      5. 6.4. Displaying Pins on a Map View
      6. 6.5. Displaying Pins with Different Colors on a Map View
      7. 6.6. Displaying Custom Pins on a Map View
      8. 6.7. Converting Meaningful Addresses to Longitude and Latitude
      9. 6.8. Converting Longitude and Latitude to a Meaningful Address
    10. 7. Implementing Gesture Recognizers
      1. 7.0. Introduction
      2. 7.1. Detecting Swipe Gestures
      3. 7.2. Detecting Rotation Gestures
      4. 7.3. Detecting Panning and Dragging Gestures
      5. 7.4. Detecting Long Press Gestures
      6. 7.5. Detecting Tap Gestures
      7. 7.6. Detecting Pinch Gestures
    11. 8. Networking, JSON, XML, and Twitter
      1. 8.0. Introduction
      2. 8.1. Downloading Asynchronously with NSURLConnection
      3. 8.2. Handling Timeouts in Asynchronous Connections
      4. 8.3. Downloading Synchronously with NSURLConnection
      5. 8.4. Modifying a URL Request with NSMutableURLRequest
      6. 8.5. Sending HTTP GET Requests with NSURLConnection
      7. 8.6. Sending HTTP POST Requests with NSURLConnection
      8. 8.7. Sending HTTP DELETE Requests with NSURLConnection
      9. 8.8. Sending HTTP PUT Requests with NSURLConnection
      10. 8.9. Serializing Arrays and Dictionaries into JSON
      11. 8.10. Deserializing JSON into Arrays and Dictionaries
      12. 8.11. Integrating Twitter Functionality into Your Apps
      13. 8.12. Parsing XML with NSXMLParser
    12. 9. Audio and Video
      1. 9.0. Introduction
      2. 9.1. Playing Audio Files
      3. 9.2. Handling Interruptions While Playing Audio
      4. 9.3. Recording Audio
      5. 9.4. Handling Interruptions While Recording Audio
      6. 9.5. Playing Audio Over Other Active Sounds
      7. 9.6. Playing Video Files
      8. 9.7. Capturing Thumbnails From a Video File
      9. 9.8. Accessing the Music Library
    13. 10. Address Book
      1. 10.0. Introduction
      2. 10.1. Retrieving a Reference to an Address Book
      3. 10.2. Retrieving All the People in the Address Book
      4. 10.3. Retrieving Properties of Address Book Entries
      5. 10.4. Inserting a Person Entry into the Address Book
      6. 10.5. Inserting a Group Entry into the Address Book
      7. 10.6. Adding Persons to Groups
      8. 10.7. Searching the Address Book
      9. 10.8. Retrieving and Setting a Person’s Address Book Image
    14. 11. Camera and the Photo Library
      1. 11.0. Introduction
      2. 11.1. Detecting and Probing the Camera
      3. 11.2. Taking Photos with the Camera
      4. 11.3. Taking Videos with the Camera
      5. 11.4. Storing Photos in the Photo Library
      6. 11.5. Storing Videos in the Photo Library
      7. 11.6. Retrieving Photos and Videos From the Photo Library
      8. 11.7. Retrieving Assets From the Assets Library
      9. 11.8. Editing Videos on an iOS Device
    15. 12. Multitasking
      1. 12.0. Introduction
      2. 12.1. Detecting the Availability of Multitasking
      3. 12.2. Completing a Long-Running Task in the Background
      4. 12.3. Receiving Local Notifications in the Background
      5. 12.4. Playing Audio in the Background
      6. 12.5. Handling Location Changes in the Background
      7. 12.6. Saving and Loading the State of Multitasking iOS Apps
      8. 12.7. Handling Network Connections in the Background
      9. 12.8. Handling Notifications Delivered to a Waking App
      10. 12.9. Responding to Changes in App Settings
      11. 12.10. Opting Out of Multitasking
    16. 13. Core Data
      1. 13.0. Introduction
      2. 13.1. Creating a Core Data Model with Xcode
      3. 13.2. Generating Class Files for Core Data Entities
      4. 13.3. Creating and Saving Data Using Core Data
      5. 13.4. Reading Data From Core Data
      6. 13.5. Deleting Data From Core Data
      7. 13.6. Sorting Data in Core Data
      8. 13.7. Boosting Data Access in Table Views
      9. 13.8. Implementing Relationships in Core Data
    17. 14. Dates, Calendars, and Events
      1. 14.0. Introduction
      2. 14.1. Retrieving the List of Calendars
      3. 14.2. Adding Events to Calendars
      4. 14.3. Accessing the Contents of Calendars
      5. 14.4. Removing Events From Calendars
      6. 14.5. Adding Recurring Events to Calendars
      7. 14.6. Retrieving the Attendees of an Event
      8. 14.7. Adding Alarms to Calendars
      9. 14.8. Handling Event Changed Notifications
      10. 14.9. Presenting Event View Controllers
      11. 14.10. Presenting Event Edit View Controllers
    18. 15. Graphics and Animations
      1. 15.0. Introduction
      2. 15.1. Enumerating and Loading Fonts
      3. 15.2. Drawing Text
      4. 15.3. Constructing, Setting, and Using Colors
      5. 15.4. Drawing Images
      6. 15.5. Drawing Lines
      7. 15.6. Constructing Paths
      8. 15.7. Drawing Rectangles
      9. 15.8. Adding Shadows to Shapes
      10. 15.9. Drawing Gradients
      11. 15.10. Displacing Shapes Drawn on Graphic Contexts
      12. 15.11. Scaling Shapes Drawn on Graphic Contexts
      13. 15.12. Rotating Shapes Drawn on Graphic Contexts
      14. 15.13. Animating and Moving Views
      15. 15.14. Animating and Scaling Views
      16. 15.15. Animating and Rotating Views
    19. 16. Core Motion
      1. 16.0. Introduction
      2. 16.1. Detecting the Availability of an Accelerometer
      3. 16.2. Detecting the Availability of a Gyroscope
      4. 16.3. Retrieving Accelerometer Data
      5. 16.4. Detecting Shakes on an iOS Device
      6. 16.5. Retrieving Gyroscope Data
    20. 17. iCloud
      1. 17.0. Introduction
      2. 17.1. Setting Up Your App for iCloud
      3. 17.2. Storing and Synchronizing Dictionaries in iCloud
      4. 17.3. Creating and Managing Folders for Apps in iCloud
      5. 17.4. Searching for Files and Folders in iCloud
      6. 17.5. Storing User Documents in iCloud
      7. 17.6. Managing the State of Documents in iCloud
      8. 17.7. Handling Conflicts in iCloud Documents
    21. Index
    22. About the Author
    23. Colophon
    24. SPECIAL OFFER: Upgrade this ebook with O’Reilly
O'Reilly logo

1.23. Allocating and Making Use of Arrays


You want to store a series of objects into another object for later use.


Use NSArray and NSMutableArray classes to store objects into arrays that are fixed and that you can change, respectively.


An object of type NSArray or any of its subclasses has the capability to store n number of other objects. These objects can then be accessed using their index. For instance, let’s say you have 10 pairs of socks. Now imagine placing them all on a flat surface from left to right and calling them socks 1, socks 2, socks 3, etc. So the leftmost sock is now addressed as socks 1, the one next to it is called socks 2, and so on. Isn’t that easier than saying something like “the blue socks next to my red socks”? That’s exactly what arrays do: they make arranging items much easier.


You can place any object of type NSObject or any of its subclasses into an array of type (or subclasses of) NSArray.

The primary difference between NSArray and NSMutableArray is that a mutable array can be changed/modified after it has been allocated and initialized, whereas an immutable array, NSArray, cannot.

Let’s have a look at an example. Let’s create an instance of NSString and two instances of NSNumber and place them in an immutable array:

NSString *stringObject = @"My String";
NSNumber *signedNumber = [NSNumber numberWithInteger:-123];
NSNumber *unsignedNumber = [NSNumber numberWithUnsignedInteger:123];

NSArray *array = [[NSArray alloc] initWithObjects:
                  unsignedNumber, nil];

NSLog(@"array = %@", array);

When you run this program, you get the following text printed to your console:

array = (
    "My String",

As you can see, we used the initWithObjects: initializer of the array. When using this initializer, pass your objects that need to be placed inside the array, one by one. At the end, terminate the list with a nil so that the runtime knows when you are terminating your list. If you don’t do so, the LLVM Compiler will throw a warning similar to this:

warning: Semantic Issue: Missing sentinel in method dispatch

We can also use the arrayWithObjects: class method of NSArray to create an autorelease array, like so:

NSArray *array = [NSArray arrayWithObjects:
                  unsignedNumber, nil];

You can call the count method on your array to get the number of objects in that array. You can go through your array using a for loop or using an enumerator. Let’s have a look at the solution with a for loop first:

NSArray *array = [NSArray arrayWithObjects:

NSUInteger counter = 0;
for (counter = 0;
     counter < [array count];

  id object = [array objectAtIndex:counter];
  NSLog(@"Object = %@", object);


And here is the output:

Object = My String
Object = -123
Object = 123

As you can see, we use the objectAtIndex: method to get an object at a specific index. Remember that indexes are zero-based. In other words, when the counter reaches -1, the loop has to stop because there can be no negative indexes in an array.

As mentioned before, you can also use fast enumeration to go through objects of an array. Fast enumeration is a language feature in Objective-C that allows you to enumerate objects in an array or dictionary (or any other object that supports fast enumeration) without having to use any counter or for loop. The format is as follows:

for (Type variableName in array/dictionary/etc){ ... }

Suppose we want to code the previous example without the overhead of a counter variable. Here is how we can do it using fast enumeration:

for (id object in array){
    NSLog(@"Object = %@", object);

The results are practically identical to the results we got from the previous version of this code that used a counter variable.

Mutable arrays are very interesting. As you probably have already guessed, immutable arrays cannot be modified once allocated and initialized. Mutable arrays, however, can be modified after their allocation and initialization. Let’s have a look at an example:

NSString *stringObject = @"My String";
NSNumber *signedNumber = [NSNumber numberWithInteger:-123];
NSNumber *unsignedNumber = [NSNumber numberWithUnsignedInteger:123];

NSArray *anotherArray = [[NSArray alloc] initWithObjects:
                         @"String 1",
                         @"String 2",
                         @"String 3", nil];

NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:
                         signedNumber, nil];

[array addObject:unsignedNumber];
[array removeObject:signedNumber];
[array addObjectsFromArray:anotherArray];

for (id object in array){
  NSLog(@"Object = %@", object);

Before we go into analyzing the code, let’s have a look at its output:

Object = My String
Object = 123
Object = String 1
Object = String 2
Object = String 3

You might be asking, “what just happened?”. Well, let’s have a look what methods of the NSMutableArray class we actually used:


This method allows us to add an object to the end of a mutable array.


Using this method, we can remove a specific object from the array. Remember that we pass an object to this method, not an index of the object. To remove an object using an index into the array, we must use the removeObjectAtIndex: method.


With this method, we can add objects from one array (either mutable or immutable) into our mutable array.


Please bear in mind that during fast enumeration of a mutable array, you must not add to or remove anything from that array or you will get a runtime error. This is the default behavior of mutable arrays during fast enumeration.

If you are interesting in block objects (and we’ll see good reasons to be, later in the book!), you can also enumerate objects in your arrays using the enumerateObjectsUsingBlock: method. The block object passed to this method should:

  1. Return no value.

  2. Have three parameters:

    1. First parameter of type id, which will be the object being enumerated at each loop of enumeration.

    2. Second parameter of type NSUInteger, which will tell you the index of the current object being enumerated.

    3. Last but not least, a parameter of type *BOOL, which you can use to stop the enumeration. This is a pointer to a boolean variable which should be NO as long as you want the enumeration to proceed. You can change the value of this pointer to YES in order to stop the enumeration at any time. You would use this if you are looking for an object in an array and you would like to stop the enumeration as soon as you’ve found that object, since there is no point continuing the enumeration if you’ve already found your object.

  NSArray *myArray = [[NSArray alloc] initWithObjects:
                      @"String 1",
                      @"String 2",
                      @"String 3",
                      @"String 4", nil];

  [myArray enumerateObjectsUsingBlock:
   ^(__strong id obj, NSUInteger idx, BOOL *stop) {

     NSLog(@"Object = %@", obj);


If you need to sort an array, simply use the new block-based sorting methods of NSArray or NSMutableArray. Just remember that the sorting methods of NSArray return a new instance of NSArray and leave the original array intact, since NSArray cannot be modified (sorting can modify an array) after it has been allocated and initialized. This is in comparison to the sorting methods of NSMutableArray, where the original array will be the target of sorting and the sorting methods will not return a new array. Let’s look at sorting a mutable array:

NSMutableArray *myArray = [[NSMutableArray alloc] initWithObjects:
                      @"String 2",
                      @"String 4",
                      @"String 1",
                      @"String 3", nil];
  [myArray sortUsingComparator:
   ^NSComparisonResult(__strong id obj1, __strong id obj2) {

    NSString *string1 = (NSString *)obj1;
    NSString *string2 = (NSString *)obj2;
    return [string1 compare:string2];


  NSLog(@"myArray = %@", myArray);

The results will then be printed to the console, as follows:

myArray = (
    "String 1",
    "String 2",
    "String 3",
    "String 4"

So, what happened? We simply called the sortUsingComparator: method of our array. This method takes in a block object (marked by the initial ^ character) that has to return a value of type NSComparisonResult. This value can be any of the following:


The two values being compared are equal.


The value on the left of the comparison is smaller than the value on the right. Think of it as this: transition from value 1 (left) to value 2 (right) is ascending, meaning that value 1 is smaller.


The value on the right is smaller than the value on the left. In other words, the transition from value 1 (left) to value 2 (right) is descending, meaning that value 1 is bigger than value 2.

So if we get String 3 as value 1 (left) and String 1 as value 2 (right), the sort function compares the two S characters and finds them the same, then the two t characters, and so on. Finally when the sort function reaches the 3 and the 1, it finds that 1 is lower than 3 in the UTF8String character set, and therefore that the second element is lower than the first.

The block object submitted to the sortUsingComparator: method takes two parameters:

First Object of type id

This is the first object in the comparison in each iteration.

Second Object of type id

This is the second object in the comparison in each iteration.

So when sorting the array, simply use a block-based approach. It’s the way Apple is pushing developers to go forward with their implementations, so it’s good to know about block objects.

The best content for your career. Discover unlimited learning on demand for around $1/day.