19 Mart 2010 Cuma


That Wacky #import Thing
Just like C, Objective- C uses header files to hold the declarations of elements such as
structs, symbolic constants, and function prototypes. In C, you use the #include statement
to inform the compiler that it should consult a header file for some definitions. You can
use #include in Objective- C programs for the same purpose, but you probably never will.
Instead, you’ll use #import, like this:
#import is a feature provided by the GCC compiler, which is what Xcode uses when you’re
compiling Objective- C, C, and C++ programs. #import guarantees that a header file will be
included only once, no matter how many times the #import directive is actually seen for
that file.


int main (int argc, const char * argv[])
const char *words[4]
= { "Joe- Bob \"Handyman\" Brown",
"Jacksonville \"Sly\" Murphy",
"Shinara Bain",
"George \"Guitar\" Books" };
int wordCount = 4;
int i;
for (i = 0; i < wordCount; i++) {
NSLog (@"%s is %d characters long",
words[i], strlen(words[i]));
return (0);
} // main

Joe-Bob "Handyman" Brown is 24 characters long
Jacksonville "Sly" Murphy is 25 characters long
Shinara Bain is 12 characters long
George "Guitar" Books is 21 characters long

int main (int argc, const char * argv[])
FILE *wordFile = fopen ("/tmp/words.txt", "r");
char word[100];
while (fgets(word, 100, wordFile)) {
// strip off the trailing \n
word[strlen(word) - 1] = ‘\0’;
NSLog (@"%s is %d characters long",
word, strlen(word));
fclose (wordFile);
return (0);
} // main

typedef enum { 
} ShapeType;

typedef struct {
ShapeType type;
ShapeColor fillColor;
ShapeRect bounds;
} Shape;

typedef struct {
int x, y, width, height;
} ShapeRect;

ShapeRect rect0 = { 0, 0, 10, 30 };

int main (int argc, const char * argv[]) 
id shapes[3];
ShapeRect rect0 = { 0, 0, 10, 30 };
shapes[0] = [Circle new];
[shapes[0] setBounds: rect0];
[shapes[0] setFillColor: kRedColor];
ShapeRect rect1 = { 30, 40, 50, 60 };
shapes[1] = [Rectangle new];
[shapes[1] setBounds: rect1];
[shapes[1] setFillColor: kGreenColor];
ShapeRect rect2 = { 15, 19, 37, 29 };
shapes[2] = [OblateSphereoid new];
[shapes[2] setBounds: rect2];
[shapes[2] setFillColor: kBlueColor];
drawShapes (shapes, 3);
return (0);
} // main

standard definition

@interface Shape : NSObject 
ShapeColor fillColor;
ShapeRect bounds;
- (void) setFillColor: (ShapeColor) fillColor;
- (void) setBounds: (ShapeRect) bounds;
- (void) draw;
@end // Shape

In Objective- C, you compose by including pointers to objects as instance
variables. So, our virtual unicycle would have a pointer to a Pedal object and
a pointer to a Tire object and would look something like this:
@interface Car : NSObject 
Engine *engine;
Tire *tires[4];
- (void) print;
@end // Car

@implementation Car
- (id) init
if (self = [super init]) {
engine = [Engine new];
tires[0] = [Tire new];
tires[1] = [Tire new];
tires[2] = [Tire new];
tires[3] = [Tire new];
return (self);
} // init

This line of code in the init method looks a little odd:
if (self = [super init]) { 
We’ll explain what’s happening here. You need to call [super init] so that the superclass (NSObject, in this case) can do any one- time initialization that it needs to do. The init method returns a value (of type id, a generic object pointer) representing the object that was initialized.
Assigning the result of [super init] back to self is a standard Objective- C convention. We do this in case the superclass, as part of its initialization work, returns a different object than the one originally created. We’ll explore this in depth in a later chapter when we cover init methods in more detail, so for now, please just nod and smile over this line of code, and we’ll move on.

Accessor Methods

@interface Car : NSObject 
Engine *engine;
Tire *tires[4];
- (Engine *) engine;
- (void) setEngine: (Engine *) newEngine;
- (Tire *) tireAtIndex: (int) index;
- (void) setTire: (Tire *) tire
atIndex: (int) index;
- (void) print;
@end // Car

@class sets up a forward reference. This is a way to tell the compiler, “Trust me; you’ll learn eventually
what this class is, but for now, this is all you need to know.”
@class is also useful if you have a circular dependency. That is, class A uses class B, and class B uses
class A. If you try having each class #import the other, you’ll end up with compilation errors. But if you
use @class B in A.h and @class A in B.h, the two classes can refer to each other happily.

hanging the Company Name

// TapDance.h
// Groovilicous
// Created by markd on 7/25/08.
// Copyright 2008 __MyCompanyName__. All rights reserved.

defaults write com.apple.Xcode PBXCustomTemplateMacroDefinitions➥
'{"ORGANIZATIONNAME" = "Length-O- Words.com";}'

NSRange range;
range.location = 17;
range.length = 4;

NSRange range = { 17, 4 };

unsigned int length = [height length];
or in expressions like so:
if ([height length] > 35) {
NSLog (@"wow, you're really tall!");

NSString *thing1 = @"hello 5";
NSString *thing2;
thing2 = [NSString stringWithFormat: @"hello %d", 5];

if ([thing1 isEqualToString: thing2]) {
NSLog (@"The strings are the same!");
is different from
if (thing1 == thing2) {
NSLog (@"They are the same object!");
Similarly, [@"zoinks" compare: @"jinkies"] would return NSOrderedDescending. And,
as you’d expect, [@"fnord" compare: @"fnord"] would return NSOrderedSame.

if ([thing1 compare: thing2
options: NSCaseInsensitiveSearch
| NSNumericSearch]
== NSOrderedSame) {
NSLog (@"They match!");

if ([fileName hasSuffix: @".mov") {
// this is a movie

To split an NSArray, use -componentsSeparatedByString:, like this:
NSString *string = @"oop:ack:bork:greeble:ponies"; 
NSArray *chunks = [string componentsSeparatedByString: @":"];

And to join an NSArray and create a string of its contents, use componentsJoinedByString::
string = [chunks componentsJoinedByString: @"  :- ) "]; 

The preceding line would produce an NSString with the contents “oop :- ) ack :- ) bork :- ) greeble :- ) ponies”.


Programmers coming from Java should feel at home with this distinction. NSString behaves like the
java String class, and NSMutableString is like Java’s StringBuffer class.

NSMutableString *string;
string = [NSMutableString stringWithCapacity: 50];
[string appendString: @"Hello there "];
[string appendFormat: @"human %d!", 39];


NSArray *array; 
array = [NSArray arrayWithObjects:
@"one", @"two", @"three", nil];

int i;
for (i = 0; i < [array count]; i++) {
NSLog (@"index %d has %@.",
i, [array objectAtIndex: i]);

NSMutableArray *array; 
array = [NSMutableArray arrayWithCapacity: 17];

Add objects to the end of the array by using addObject:.
- (void) addObject: (id) anObject;
You can add four tires to an array with a loop like this:
for (i = 0; i < 4; i++) { 
Tire *tire = [Tire new];
[array addObject: tire];

[array removeObjectAtIndex: 1];


NSEnumerator *enumerator; 
enumerator = [array objectEnumerator];
id thingie;
while (thingie = [enumerator nextObject]) {
NSLog (@"I found %@", thingie);

Tire *t1 = [Tire new];
Tire *t2 = [Tire new];
Tire *t3 = [Tire new];
Tire *t4 = [Tire new];

NSDictionary *tires;
tires = [NSDictionary dictionaryWithObjectsAndKeys:
t1, @"front- left", t2, @"front- right",
t3, @"back- left", t4, @"back- right", nil];

Tire *tire = [tires objectForKey: @"back- right"];

NSMutableDictionary *tires;
tires = [NSMutableDictionary dictionary];
[tires setObject: t1 forKey: @"front- left"];
[tires setObject: t2 forKey: @"front- right"];
[tires setObject: t3 forKey: @"back- left"];
[tires setObject: t4 forKey: @"back- right"];

NSValue, NSNull
NSNumber is actually a subclass of NSValue, which wraps arbitrary values. You can use
NSValue to put structures into NSArrays and NSDictionaries. Create a new NSValue using
this class method:

NSValue *value; 
value = [NSValue valueWithBytes: &rect
objCType: @encode(NSRect)];
[array addObject: value];

[contact setObject: [NSNull null]
forKey: @"home fax machine"];

id homefax;
homefax = [contact objectForKey: @"home fax machine"];
if (homefax == [NSNull null]) {
// ... no fax machine. rats.


NSFileManager *manager;
manager = [NSFileManager defaultManager];
NSString *home;
home = [@"~" stringByExpandingTildeInPath];
NSDirectoryEnumerator *direnum;
direnum = [manager enumeratorAtPath: home];
NSMutableArray *files;
files = [NSMutableArray arrayWithCapacity: 42];
NSString *filename;
while (filename = [direnum nextObject]) {
if ([[filename pathExtension]
isEqualTo: @"jpg"]) {
[files addObject: filename];
NSEnumerator *fileenum;
fileenum = [files objectEnumerator];
while (filename = [fileenum nextObject]) {
NSLog (@"%@", filename);

Hiç yorum yok:

Yorum Gönder