conversations.from: human
conversations.value: Provide a description for a book titled Learn iOS 7 App Development about Beginning, Xcode, Having with the genre: Computers & Technology, Programming.
conversations.from: assistant
conversations.value: the author is a professional software engineer, with over 25 years of experience in software and systems development. He is the author of Beginning Xcode and the holder of a network patent. Having made the transition to Mac OS X many years ago, he has never looked back.
conversations.from: human
conversations.value: Provide the first five paragraphs for this book.
conversations.from: assistant
conversations.value: Learn iOS 7 App Development
  But before you get to that, let me share a few nuggets about affine transforms. Transforms can be used in a variety of places, not just to distort the frame of a view. They can be used to transform the coordinate system of the current graphics context while you draw your view. In essence, this use applies a transform to the bounds of your view, changing the effect of what you draw in your view, rather than translating the final results of your view. For example, you might have a complex drawing that you want to shift up or down in your view, or maybe draw something upside down. Rather than recalculate all of the coordinates you want to draw, use the CGContextTranslateCTM, CGContextRotateCTM, or CGContextScaleCM functions to shift, rotate, or resize all of the drawing operations. You'll use these functions in Chapter 16.
  You can also shift the drawing coordinates of your view by changing the origin of the bounds property.
  Transforms can also be used to change the points in a Bézier path. Create the desired transform and then send the path an -applyTransform: message. All of the points in the path will be altered using that transform. This is a destructive translation; the original points in the curve are lost.
  If one gesture recognizer is fun, then two must make a party. This time, you're going to add a pinch/zoom gesture that will resize your shape view. As before, start by creating and attaching a second gesture recognizer object at the end of the -addShape: method (CYViewController.m):
  The pinch gesture recognizer object doesn't need any configuration because a pinch/zoom is always a two-finger gesture. At the top of the file add a prototype for the new action method in the private @interface SYViewController () section:
conversations.from: human
conversations.value: Provide three more paragraphs.
conversations.from: assistant
conversations.value: The tracking mode isn't so lucky. The initial tracking mode Pigeon uses is MKUserTrackingModeFollow, whose integer value is 1. If there's no value for the kPreferenceHeading key, you don't want to set trackingMode to MKUserTrackingModeNone (0) by mistake.
  Instead, the code uses the second solution. It first gets the property list (NSNumber) object for that key. You use this knowledge to either restore the user-selected mode or set the correct default.
  The code uses the method -objectForKey: to test for the presence of any value. A property list object ultimately represents every value in a property list. The methods -boolForKey:, -integerForKey:, and so on, convert the simple integer, floating-point, or Boolean values to, and from, an NSNumber object for you.
conversations.from: human
conversations.value: Add another sentence about tracking.
conversations.from: assistant
conversations.value: The tracking mode isn't so lucky. The initial tracking mode Pigeon uses is MKUserTrackingModeFollow, whose integer value is 1. If there's no value for the kPreferenceHeading key, you don't want to set trackingMode to MKUserTrackingModeNone (0) by mistake. 
  Instead, the code uses the second solution. It first gets the property list (NSNumber) object for that key. If there's no value for that key, user defaults returns nil and you know that a tracking value has never been set. You use this knowledge to either restore the user-selected mode or set the correct default. 
  The code uses the method -objectForKey: to test for the presence of any value. A property list object ultimately represents every value in a property list. The methods -boolForKey:, -integerForKey:, and so on, convert the simple integer, floating-point, or Boolean values to, and from, an NSNumber object for you.
conversations.from: human
conversations.value: Provide the last five paragraphs.
conversations.from: assistant
conversations.value: The process of "spinning" is a huge waste of CPU resources, but spin locks make up for that by being extremely fast when locking and unlocking a mutex that's not locked by any other thread. These are called optimistic locks.
  Spin locks are opaque C variables and you use C functions to lock and unlock them. Other than that, you use them exactly the way you'd use an NSLock object:
  As an example, iOS's memory management functions (the ones that allocate and return memory blocks to the heap) use spin locks. Think about it; all memory functions have to be thread-safe, since any thread can create and destroy objects. They also have to be extremely fast, and the probability of two threads allocating an object at exactly the same moment is really small. For functions like this, spin locks are perfect.
  When you're ready to wade into the deep end of concurrency and thread safety, here are two good places to start, both of which can be found in Xcode's Documentation and API Reference window:
  Multithreading is definitely an advanced app development technique. Master it, and you can create apps that do an amazing amount of work, while staying responsive and smooth. I won't declare you a concurrency guru just yet, but you've got all of the basics and you know where to find out more.
conversations.from: human
conversations.value: Reverse the sentences.
conversations.from: assistant
conversations.value: I won't declare you a concurrency guru just yet, but you've got all of the basics and you know where to find out more.. Master it, and you can create apps that do an amazing amount of work, while staying responsive and smooth.
  When you're ready to wade into the deep end of concurrency and thread safety, here are two good places to start, both of which can be found in Xcode's Documentation and API Reference window:
  Multithreading is definitely an advanced app development technique. For functions like this, spin locks are perfect. They also have to be extremely fast, and the probability of two threads allocating an object at exactly the same moment is really small. Think about it; all memory functions have to be thread-safe, since any thread can create and destroy objects. Other than that, you use them exactly the way you'd use an NSLock object:
  As an example, iOS's memory management functions (the ones that allocate and return memory blocks to the heap) use spin locks.
  Spin locks are opaque C variables and you use C functions to lock and unlock them. These are called optimistic locks.The process of "spinning" is a huge waste of CPU resources, but spin locks make up for that by being extremely fast when locking and unlocking a mutex that's not locked by any other thread