- •C and Objective-C
- •How this book works
- •How the life of a programmer works
- •Installing Apple’s developer tools
- •Getting started with Xcode
- •Where do I start writing code?
- •How do I run my program?
- •So what is a program?
- •Don’t stop
- •Types
- •A program with variables
- •Challenge
- •Boolean variables
- •When should I use a function?
- •How do I write and use a function?
- •How functions work together
- •Local variables, frames, and the stack
- •Recursion
- •Looking at the frames in the debugger
- •return
- •Global and static variables
- •Challenge
- •printf()
- •Integer operations
- •Integer division
- •Operator shorthand
- •Floating-point numbers
- •Tokens for displaying floating-point numbers
- •The while loop
- •The for loop
- •break
- •continue
- •The do-while loop
- •Challenge
- •Getting addresses
- •Storing addresses in pointers
- •Getting the data at an address
- •How many bytes?
- •NULL
- •Stylish pointer declarations
- •Challenges
- •Writing pass-by-reference functions
- •Avoid dereferencing NULL
- •Creating and using your first object
- •Message anatomy
- •Objects in memory
- •Challenge
- •Nesting message sends
- •Multiple arguments
- •Sending messages to nil
- •Challenge
- •Challenge
- •NSMutableArray
- •Reference pages
- •Quick Help
- •Other options and resources
- •Accessor methods
- •Dot notation
- •Properties
- •self
- •Multiple files
- •Challenge
- •Overriding methods
- •super
- •Challenge
- •Object ownership and ARC
- •Creating the Asset class
- •Adding a to-many relationship to Employee
- •Challenge
- •Retain cycles
- •Weak references
- •Zeroing of weak references
- •For the More Curious: Manual reference counting and ARC History
- •Retain count rules
- •NSArray/NSMutableArray
- •Immutable objects
- •Sorting
- •Filtering
- •NSSet/NSMutableSet
- •NSDictionary/NSMutableDictionary
- •Preprocessor directives
- •#include and #import
- •#define
- •Global variables
- •enum
- •#define vs global variables
- •Writing an NSString to a file
- •Reading files with NSString
- •Writing an NSData object to a file
- •Reading an NSData from a file
- •Target-action
- •Helper objects
- •Notifications
- •Which to use?
- •Callbacks and object ownership
- •Challenge
- •Getting started with iTahDoodle
- •BNRAppDelegate
- •Adding a C helper function
- •Objects in iTahDoodle
- •Model-View-Controller
- •The application delegate
- •Setting up views
- •Running on the iOS simulator
- •Wiring up the table view
- •Adding new tasks
- •Saving task data
- •For the More Curious: What about main()?
- •Edit BNRDocument.h
- •A look at Interface Builder
- •Edit BNRDocument.xib
- •Making connections
- •Revisiting MVC
- •Edit BNRDocument.m
- •Writing init methods
- •A basic init method
- •Using accessors
- •init methods that take arguments
- •Deadly init methods
- •Property attributes
- •Mutability
- •Lifetime specifiers
- •copy
- •More about copying
- •Advice on atomic vs. nonatomic
- •Key-value coding
- •Non-object types
- •Defining blocks
- •Using blocks
- •Declaring a block variable
- •Assigning a block
- •Passing in a block
- •typedef
- •Return values
- •Memory management
- •The block-based future
- •Challenges
- •Anonymous block
- •NSNotificationCenter
- •Bitwise-OR
- •Bitwise-AND
- •Other bitwise operators
- •Exclusive OR
- •Complement
- •Left-shift
- •Right-shift
- •Using enum to define bit masks
- •More bytes
- •Challenge
- •char
- •char *
- •String literals
- •Converting to and from NSString
- •Next Steps
- •Index
Chapter 6 Numbers
int x = 5;
x += 5; // x is 10
You can think of the second line as “assign x the value of x + 5.” In addition to +=, there is also -=, *=, /=, and %=.
To get the absolute value of an int, you use a function instead of an operator. The function is abs(). If you want the absolute value of a long, use labs(). Both functions are declared in stdlib.h:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, const char * argv[])
{
printf("3 * 3 + 5 * 2 = %d\n", 3 * 3 + 5 * 2);
printf("11 / 3 = %d remainder of %d \n", 11 / 3, 11 % 3); printf("11 / 3.0 = %f\n", 11 / (float)3);
printf("The absolute value of -5 is %d\n", abs(-5));
return 0;
}
Floating-point numbers
If you need a number with a decimal point, like 3.2, you use a floating-point number. Most programmers think of a floating-point number as a mantissa multiplied by 10 to an integer exponent. For example, 345.32 is thought of as 3.4532 x 102. And this is essentially how they are stored: a 32-bit floating number has 8 bits dedicated to holding the exponent (a signed integer) and 23 bits dedicated to holding the mantissa with the remaining 1 bit used to hold the sign.
Like integers, floating-point numbers come in several sizes. Unlike integers, floating-point numbers are always signed:
float g; |
// 32-bits |
|
double h; |
// |
64-bits |
long double i; // |
128-bits |
Tokens for displaying floating-point numbers
printf() can also display floating point numbers, most commonly using the tokens %f and %e. In main.c, replace the integer-related code:
int main (int argc, const char * argv[])
{
double y = 12345.6789; printf("y is %f\n", y); printf("y is %e\n", y);
return 0;
}
When you build and run it, you should see:
y is 12345.678900 y is 1.234568e+04
So %f uses normal decimal notation, and %e uses scientific notation.
46
( & &%
Q) + < & ' ! ( & ') ! C ' + ' & * 7
! " #$%
&
? I 975=6 4:8T,
'?0 ,+ '! ?%,
'?0 ,+ '! ?%,
-,
.
B ) ) ) ) 7
? 975=6 48 ? 9 75 J-=
-# ' ( (& + # '
( J " ; + ) + ) ; ! & ) + & ' ) + ' ! ( + G ' ) ? ! K ) + )'' & " ' 7 ' ) ; =) ) !
& ) ) & ' &) ) ) ) ' & 7
> + 7 & &) V
&&
$' V & ! % + )' )' ! )-8=9!
!.
This page intentionally left blank
7
Loops
In Xcode, create yet another new project: a C Command Line Tool named Coolness.
The first program I ever wrote printed the words, “Aaron is Cool”. (I was 10 at the time.) Write that program now:
#include <stdio.h>
int main(int argc, const char * argv[])
{
printf("Aaron is Cool\n"); return 0;
}
Build and run the program.
Let’s suppose for a moment that you could make my 10-year-old self feel more confident if the program printed the affirmation a dozen times. How would you do that?
Here’s the dumb way:
#include <stdio.h>
int main(int argc, const char * argv[])
{
printf("Aaron is Cool\n"); printf("Aaron is Cool\n"); printf("Aaron is Cool\n"); printf("Aaron is Cool\n"); printf("Aaron is Cool\n"); printf("Aaron is Cool\n"); printf("Aaron is Cool\n"); printf("Aaron is Cool\n"); printf("Aaron is Cool\n"); printf("Aaron is Cool\n"); printf("Aaron is Cool\n"); printf("Aaron is Cool\n"); return 0;
}
The smart way is to create a loop.
The while loop
The first loop we’ll use is a while loop. The while construct works something like the if construct we discussed in Chapter 4. You give it an expression and a block of code contained by curly braces. In the
49