By Developers, For Developers

Historical errata for Cocoa Programming

PDF PgPaper PgTypeDescriptionFixed onComments
1OK

On the cover a dot is missing in “Daniel H. Steinberg”, I think.

(Dave says: actually, Daniel styles it without the period. Pure affectation, I’m sure :)

2008-09-18
12TYPO

The word ‘get’ is repeated - “get get” - in the last paragraph on the page.

2008-10-06
12TYPO

Instead of: “Even though those are the two applications get get most” write: “two applications that get most”

2008-10-06
13TYPO

The phrase “Who don’t you just…” should probably read “Why don’t you just…”

2008-10-06
13TYPO

Instead of: “An experienced Cocoa developer will look at your
code and make a face and suggest ‘Who don’t you just …’” I think you rather meant to write: “Why don’t you just …” !? - [So: Why didn’t you just???]

2008-10-06
13TYPO

“But fifty lines in you’ll be aware that you’re working too hard.
you will know that those two lines probably exist.” - As a German, I doubt the meaning of “fifty lines in”, but would at least expect a comma before “you’ll”. “you” after the next fullstop should be uppercase, of course.

2008-10-06
17OK

Strongly suggest:
Add a pic of the (finished) application at this section “2.2 Creating the appearance with Interface Builder”, so that the heading title makes sense. Also a visual is key to understand what the goal is. Finally, it’s also key especially for the Figure 2.6 (IB springs) discussion.

2008-10-06
51SUGGEST

Explain the use of the asterisk in the following line:’

IBOutlet WebView * myWebView;

2008-10-26
19TYPO

“It’s easy to get lose the big picture ..” was probably meant to be something like: It’s easy to lose sight of the big picture …

2008-10-06
55TYPO

“Next, in Interface Builder and select the Connections Inspector for the” —>
“Next, in Interface Builder select the Connections Inspector for the”

2008-10-06
16OK

on section 2.1 the 4th paragraph the last sentence:
" In this chapter you’ll do all of your work in the MainMenu.xib file."
its MainMenu.nib rather than MainMenu.xib

its also repeated at section 2.2:
“Double-click on MainMenu.xib(English)”
again MainMenu.nib

2008-10-06
39TYPO

Last sentence: “This allows us
to have a handle to any object that called goBack: not matter what it’s
type.” should probably be “This allows us
to have a handle to any object that called goBack: NO matter what it’s
type.”

2008-10-06
39TYPO

Missing “at”, as in: “We’ll look AT a typical example of how you might take advantage…” at the bottom of page 39.

2008-10-06
39TYPO

— in the last 2 sentences on the page, there are 2 separate errors:
to have a handle to any object that called goBack: not matter what it’s
type. We’ll look a typical example of how you might take advantage of
— instead of “not matter what” it should read “no matter what”
— (change “not” to “no”)

— instead of “We’ll look a typical” it should read “We’ll look at a typical”
— (add “at” after “look”)

2008-10-06
41TYPO

— middle of first paragraph:
moveToBeginningOfSentenceAndModifySelection:. You might end up The
name of a method might even be longer than its implementation—but
— remove sentence fragment “You might end up”
— a complete sentence is left, starting with “The name of a method…”

2008-10-06
41TYPO

3.5 Dynamic Binding
Let’s take a look behind the scenes at what happens when an an Obj-C
— remove redundant copy of “an” before “Obj-C”

2008-10-06
53TYPO

— first sentence after graphic (continued from previous page):
and object what they can call on the class to do.
— should read (add ‘s’ to object):
and objects what they can call on the class to do.

2008-10-06
57TYPO

— middle of page, after code
[self resetButtons];
We don’t declare resetButtons in the header file because we aren’t encouraging
other object to send
— should read (add ‘s’ to object):
other objects to send

2008-10-06
60TYPO

— end of second paragraph under 5.1 Delegates
You could probably come up applications that would benefit from a

— should read (add ‘with’ between ‘up’ and ‘applications’):
You could probably come up with applications that would benefit from a

2008-10-06
65TYPO

— last paragraph of page, before code:
cleaning pass. There real isn’t any need for our controller to know about

— should read (change ‘real’ to ‘really’):
cleaning pass. There really isn’t any need for our controller to know about

2008-10-06
21SUGGEST

Daniel: While you’re describing springs and struts, you may want to add a snippet on how to set a minimum width and height for the window. (Or you could make it a DIY challenge with hints). The UI gets kind of gunked up if you squeeze it all the way down and expand it again. It’s also fun to see what happens if you set the min dimensions to something larger than the starting dimensions. Nice work, as always. Can’t wait to see the finished product!

2008-10-26
39TYPO

section 3.4 page 39 last paragraph ‘goBack: not matter what it’s type’ should be NO matter not NOT MATTER

2008-10-06
53TYPO

page 53 first word ‘and’ should be ‘an’

2008-10-06
57TYPO

page 57 5th paragraph in the text ‘encouraging other object to’ object should be plural objects.

2008-10-06
65TYPO

page 65 last paragraph “There real isn’t any need” should be “There really isn’t any need”

2008-10-06
23TYPO

“So you just need to wire up the web views ability to go”
Should use the possessive on web view’s

2008-10-06
11TYPO

Figure 1.1 is labeled “New Project Templates” and should be labeled “Helpful Tools”.

Figure 1.2 is labeled “Helpful Tools” and should probably be labeled “Context Sensitive Help Menu”.

2008-10-06
16OK

Delete the comma after “Figure 2.2”

(Dave says: this is house style)

2008-10-06
53TYPO

On the first line, I believe “object” should be plural.

2008-10-06
70TYPO

— last paragraph (before code) last 2 sentences:
coming from any object—but we only want to respond to updates from
out web view. So your header file should look like this.
— should read (change ‘out’ to ‘our’):
coming from any object—but we only want to respond to updates from
our web view. So your header file should look like this.

2008-10-06
72TYPO

— starting at the 3rd line of the 3rd paragraph:
ods goBack and goBack: are completely different methods even though
they almost the same. It is too easy to drop the “:” and end up with a

— should read (add ‘are’ between ‘they’ and ‘almost’):
they are almost the same. It is too easy…

2008-10-06
10SUGGEST

I’m pretty sure 10.5.0 Leopard disks came with XCode 3.0 (it’s not written on the disk, but that’s what I had here). So, maybe it would be a good idea to highly recommend installing the latest from the download.

2008-10-06
11SUGGEST

The free level does not give you “the same access to
pre-release software as the paid membership levels. ” There’s quite a lot that the free level excludes including OS-X pre-releases (even the patch levels are excluded.) They do seem to include XCode updates at the free level.

2008-10-06
17SUGGEST

“Quit SimpleBrowser and let’s get started on creating the
inter face.” Not just by closing the window. Yes, I know better, and it still got me.

2008-10-06
18SUGGEST

In XCode 3.1.1, Figure 2.4 doesn’t look the same… the middle pane of the library includes much more information (and has several options for display)

2008-10-26
13TYPO

“Who don’t you just…” should be “Why don’t you just…” in the first paragraph.

2008-10-06
39TYPO

Last para sentence: " The type of sender is upcast to id" is missing a period.

2008-10-06
67TYPO

The first bullet point at the bottom of the page reads: “You are sending the addObserver:selector:name:object: method to the default notification center.” It should probably be either: “You are sending the addObserver:selector:name:object: message to the default notification center.” or “You are calling the addObserver:selector:name:object: method to the default notification center.”

2008-10-06
67TYPO

Bottom bullet on page 67 reads: “Here the observer is set to self but it can be any object interested in receiving the notification.”, but in the method call above, observer is actually set to “observerObject”.

2008-10-06
83TYPO

In this sentence: “If the users of your application are running Tiger, for exam-
ple, and you don’t do any memory management in your application,
they’ll seem your application as a memory hog.” the word “seem” should probably be “see.”

2008-10-06
87TYPO

This sentence: “At this point you are explicitly creating two objects in code. One of them, myGreeting, was an instance of the class TemporaryGreeting which
we created ourself.” has two typos: myGreeeting should be myGreeter, and TemporaryGreeting should be Greeting.

2008-10-06
91TYPO

The refactoring example (both picture and code) isn’t showing (or using) the “[worldGreeter release];” statement that you would get from renaming myGreeter on the prior page.

2008-10-26
90TYPO

In these sentences “Both instances of myGreeter are highlighted. Change the “my” to “world” in one of them and you’ll see that they both are changed to worldGreeter." the word “both” should be changed to “all”, since there are now three instances of “myGreeter” instead of two. Also, figure 6.3 is not showing the new [myGreeter release] statement.

2008-10-06
93TYPO

The output “Hello, world.
Hello, Daniel. ” is missing the output “Releasing a Greeter object.” after each line, since that log statement is still in there from before.

2008-10-06
64ERROR

The implementation of webView:didFinishLoadForFrame: should be [self resetButtons]; because we haven’t modify yet the resetButtons method.

2008-10-26
68ERROR

There doesn’t seem to be any WebViewProgressEndedNotification in XCode 3.1. Looks like it’s been renamed to WebViewProgressFinishedNotification.

2008-10-06
71SUGGEST

FWIW: the “initial value” in IB 3.1 (build 670) (which we’re setting to 0.0) is called “Current:”.

2008-10-26
71SUGGEST

I found the discussion in section 5.9 awkward and disruptive here. We’re right in the middle of doing the load indicator and notifications, and suddenly we’re called back to section 5.2 and delegates. Yes, the final two paragraphs deal with notifications, but we haven’t even seen selectors in action yet. Maybe move the first section to right after 5.2 and the bit on selectors to after 5.10?

2008-10-26
74SUGGEST

You can tersify (?) the solution even more by dispensing with clearLoadIndicator; and the corresponding notification. Set hidden to NO on the update, and the estimated progress notification will take care of resetting the value of the indicator to 0.0 (or close enough as to make no difference to the naked eye on the pages I tried). If you wanted to make absolutely sure, you could set the value of the loadIndicator to 0.0 before hiding it on progress finished.

2008-10-26
78SUGGEST

Re: “More concretely, here is your header file for the Greeter.” Looks like the listing for Greeter.h should follow this line. Also, FWIW, the download references Greeter2.h, not Greeter.h. Same for Greeter2.m / Greeter.m.

2008-10-06
46TYPO

In the second sentence of the first paragraph after the SimpleBrowserController1.h code listing, the word “interract” should be “interact”.

2008-10-06
64SUGGEST

In your first mention of the webView:didFinishLoadForFrame: delegate you pass the sender to resetButtons before you’ve discussed removing the myWebView outlet on the next page. Shouldn’t:

- (void)webView:(WebView )sender didFinishLoadForFrame:(WebFrame)frame {
[inputField setStringValue:[sender mainFrameURL]];
[self resetButtons:sender];
}

Really be:

- (void)webView:(WebView )sender didFinishLoadForFrame:(WebFrame)frame {
[inputField setStringValue:[sender mainFrameURL]];
[self resetButtons];
}

Before the “Clean Up” section?

2008-10-26
83TYPO

In the third paragraph, I believe the word ‘seem’ should be ‘see’: “…they’ll seem your application as a memory hog.”

2008-10-06
87TYPO

In the first paragraph, where you write “One of
them, myGreeting, was an instance of the class TemporaryGreeting which
we created ourself”, I believe ‘myGreeting’ should be ‘myGreeter’ and ‘TemporaryGreeting’ should be ‘Greeter’.

2008-10-06
90OK

Figure 6.3: Renaming a Variable appears in the wrong place. A better place would be down in section 6.8 where you write about renaming a variable.

2008-10-06
90TYPO

“Choose Edit All in Scope. Both instances of myGreeter are highlighted.
Change the “my” to “world” in one of them and you’ll see that they both
are changed to worldGreeter."

Both? There are three instances of myGreeter (the delaration, calling ‘sayHello’, and calling release) and all three are highlighted and changed

2008-10-06
68ERROR

second paragraph of Section 5.7 Awake from Nib starts “Because you added your two controller objects to your nib,…” however we have only added one controller object so far - SimpleBrowserController.

2008-10-06
70TYPO

replace out with our in the sentence “We could listen to notifications coming from any object-but we only want to respond to updates from out web view”

2008-10-06
41TYPO

First para: " In WebView you can see the method
moveToBeginningOfSentenceAndModifySelection:. You might end up The
name of a method might even be longer than its implementation—but
what the method does is immediately clear to anyone who invokes it in
code or connects to it using Inter face Builder."
Some confusion around the “You might end up”, also “Inter face Builder” should most likely be: “Interface Builder”

2008-10-06
32SUGGEST

Second last paragraph on this page: Change Interface Builder Setting to not Flatten Compiled XIB Files. You’ll find that mentioned checkbox in the “Build” tab within the Project Info Window.

2008-10-06
27SUGGEST

“Look
inside your projects build/Release directory and you should see a version
of your SimpleBrowser application that can be distributed and run on
other machines.”

This stumped me for a while, since I couldn’t find the build/Release directory.

I think I finally found it by selecting SimpleBrowser under groups and files, bringing up the right button menu and selecting “Reveal in Finder” then expanding the folder in the finder where I found the build directory which has both Debug and Release subdirectories.

Is this the right place? I think that the book could be clearer here.

2008-10-26
16TYPO

second paragraph: … this Simple Browser example, You’ll need … <= shouldn’t be capital Y

2008-10-06
18TYPO

Second paragraph … that make sure you on the same line … <= you ‘are’ on

2008-10-06
30TYPO

Second text para: … search for the string takeStringURLFrom:. you should … <= either URLFrom:, you or URLFRom:. You

2008-10-06
30TYPO

last text para: to the destination the NSTextField object <= should be to the destination NSTextField object?

2008-10-06
21TYPO

“It’s easy to get lose sight of the big picture…”

2008-10-26
109TYPO

s/ApplicationGreeter.h/ActivityController.h/

2008-10-26
66TYPO

In the - (void)webView:(WebView )sender didFinishLoadForFrame:(WebFrame)frame delegate implementation, the last line that calls the resetButtons has an extra argument that doesn’t need to be there and gives up a compiler warning if it’s there.
The line
[self resetButtons:sender];
does not need the trailing sender. I think it should be.
[self resetButtons];

I have tried this on a few machines and running it with the sender gives me a compiler warning. It’s not needed.

2008-10-26
108SUGGEST

Use objectForKey: instead of the valueForKey: (should be used only with KVC otherwise the reader might get confused).

2008-10-26
33ERROR

First paragraph: “WebView object passed in as the sender” - wouldn’t the sender be the NSTextField?

2008-10-26
42TYPO

Third paragraph, last sentence “…as is…” s/b “…as are…”

Also (very minor suggestion), first paragraph, last sentence, “…its dual…” - counterpart might be a clearer word choice.

2008-10-26
48SUGGEST

“WebView, in contrast, was a subclass of NSView which in turn was a subclass of NSResponder which is a subclass of NSObject”
- mixed tenses (is/was) - use one or the other (I’d go with is).

2008-10-26
12SUGGEST

“We start to think that OO is all about the objects.”

Suggest start -> tend. Because it’s a sneaky recurring pattern of thinking. :)

2008-10-26
14TYPO

Fig. 1.2 “Helpful tools” is still labelled incorrectly. It should be something like “Context Sensitive Help Menu”

2008-10-26
21SUGGEST

“Note that Quit is not under the File menu as you might expect.”

Do you need this footnote? Quit is not under the file menu in (almost?) every Mac app.

2008-10-26
29SUGGEST

“using the Active Build Configuration drop down in Xcode if it is visible.”

It’s only visible if you’ve customized XCode’s toolbar to include it.

2008-10-26
93TYPO

You will also need to highlight the “[worldGreeter release];” line or the refactoring will try and return a pointer to a Greeter object instead of a void.

2008-10-26
40SUGGEST

“If you click on the goBack method”

Maybe something like this?

“If you click on the goBack method (not the goBack: listed right below it)”

2008-10-26
42SUGGEST

“appreciate the fact that you don’t have to think of what the true, false, and true refer to.”

Suggest “think of” -> “recall”

2008-10-26
43SUGGEST

Starting with “Here’s more than you need to know.”, begin a new paragraph.

2008-10-26
46SUGGEST

From looking at their site, “Second Life” is probably ®

2008-10-26
46OK

For some reason, page 46 doesn’t have a blue footer in the generated PDF.

2008-10-26
52SUGGEST

It’s more natural to name figure 4.3 “Actions and Outlets” because that agrees with the order of the diagram, and the order introduced in the text.

Consider renaming section 4.3 as well. (And watch out, it’s mentioned previously.)

2008-10-26
52OK

I see you mix the order of the words Actions and Outlets in other pages, and if you decide to make them all consistent, you’ll need to check for it throughout.

2008-10-26
12OK

“that Smalltalk is not only NOT its syntax …” - double “not”.
Also, Alan Kay’s quote in this paragraph has no closing quotation mark.

2008-10-26
56SUGGEST

I had trouble here:

“Remember that the web view is going to need to send a message back to the textField to get its string value.”

Suggest something like this:

“Remember that the textField will send a message to the controller when ”Enter" is pressed and then the web view is going to need to send a message back to the textField to get its string value."

2008-10-26
108OK

Figure 7.2 is not exactly the correct display. Because the “updateConsole:” method has the “\
” format the string output will actually be on two lines instead of one.

2008-10-26
92OK

Putting a picture of code (Figure 6.3) in the middle of a code listing could be confusing, but at the very least is a break in train of thought. You might consider moving the figure to the bottom of the page.

(Dave says: we do layout at the very end)

2008-10-26
95SUGGEST

When adding initWithName to Greeter.m, adding the following to Greeter.h will prevent compiler warnings about the possibility of initWithName not being defined:

- (id) initWithName:(NSString *) name;

2008-10-27
58SUGGEST

Section 4.7 is broken out as an exercise, but section 4.9 begins with an exercise that isn’t broken out into a section.

One suggestion:

“You should complete the exercise before reading on as the solution is
included with our code below. ”

->

Try implementing this on your own before reading on as the solution is
included with our code below.

2008-10-26
59TYPO

Need a comma:

Before you move on click on

->

Before you move on, click on

2008-10-27
63SUGGEST

Look in the “Tasks” section of the WebView docs and you will see ten
methods for assigning and working with delegates.

->

Look in the “Tasks” section of the WebView docs under “Getting and Setting Delegates” and you will see ten
methods for assigning and working with delegates.

2008-10-26
66ERROR

I agree with Kent Fenwick’s comment, you don’t need sender in resetButtons:sender at this point. When you take it out, you should mention putting it in on page 68.

2008-10-26
73SUGGEST

Set the
values to the range retur ned by the estimatedProgress and set the initial
value at 0.0.

Add: Use the Size Inspector (and Cocoa Simulator) to set appropriate Autosize settings.

2008-10-26
83SUGGEST

" Set the Active Build Configuration to “Release” This isn’t done in the Project Settings dialog, that only changes settings for the release build. You change this from the XCode toolbar. Suggest a new paragraph here, and change it to:

“From the XCode toolbar, set the Active Build Configuration….”

2008-10-26
93ERROR

“Both instances of myGreeter are highlighted.” There are three. Somehow we’ve lost [myGreeter release] from page 92. This affects Fig 6.3 and 6.4.

2008-10-26
94SUGGEST

“You don’t have to make any changes to the header file.”

Throughout, I’ve been confused on what methods you have to declare in the header file, and what you don’t.

2008-10-26
98TYPO

Controller to go with ourGreeter class Model.

Need a space: our Greeter

2008-10-26
104TYPO

scoffolding -> scaffolding

2008-10-26
9393ERROR

You show how to use XCode’s Refactoring capabilities here. The only thing is you refer to a C-style function as a method. In some languages, such as Ruby, there is little or no distinction between functions and methods and in many cases it is a semantic argument.

C-style functions have the syntax:
returntype functionName(argument);

Strictly speaking,
void greetTheWorld(void);
is a function.

In Objective-C, a method is a message that can be sent to an object. A function is still just an old C-style function, a.k.a. subroutine.
The distinction is important, particularly if a reader visits a mailing list such as cocoa-dev ! If the terms were misused, there would surely be flamewar.

2008-10-26
90SUGGEST

Generally, there is an ongoing debate as to what is a proper Objective-C init method implementation.

One thing to consider is that there is no need to explicitly return nil.
The reason to call [super init] is that NSObject will return nil if init fails.

It might be worthwhile to note that typing init and using XCode’s auto-completion will provide an Apple-sanctioned init definition to start with. If you vary from that, you might want to include some discussion in the book as to why and what for.

2008-10-26
109TYPO

“First declare a couple of variables we’ll need in ApplicationGreeter.h.”
Should read:
“First declare a couple of variables we’ll need in ActivityController.h.”

2008-10-26
14TYPO

Last paragraph in section 1.3:
“Even though those are the two applications get most of the attention,” Probably should be “Even though those are the two applications THAT get most of the attention,” or “Even though those two applications get most of the attention,”

2008-10-26
80TYPO

Second Paragraph:

In this iteration of “Hello, world” we’re going to define a new class but
not create any objects from it.. It sounds a bit confusing and we’ll sel-
dom do this in real life but you will actually use class methods all the
time to create objects so in this section we’ll create and use our own
class method.

At the end of first sentence there are two periods.

2008-10-26
66TYPO

- (void)webView:(WebView )sender didFinishLoadForFrame:(WebFrame)frame {
[inputField setStringValue:[sender mainFrameURL]];
[self resetButtons:sender];
}

Should not pass sender in the final method.

2008-10-26
106TYPO

Second paragraph begins with

“As a last step we’ll implement the updateConsole: method that get called when either notification is received”.

Should read:

“As a last step we’ll implement the updateConsole: method that gets called when either notification is received.”

2008-10-27
30SUGGEST

In the discussion about adding a reference to the Webkit framework, if readers have dorked around with XCode (like I had), they may need to be pointed to /System/Library/Frameworks to find Webkit.framework. A simple note on this page would probably be worthwhile.

2008-11-20
55TYPO

From the “Joe asks” block:

“A warning could be a note at compile time telling you that you’ve sent a message to an object that MAY didn’t declare a method with that signature.”

Probably don’t need may in this sentence.

2008-11-20
57SUGGEST

In section 4.5 the reader is using Interface Builder. Section 4.6 uses Xcode to add the code to the SimpleBrowserController.m file. It might be good to mention that the reader needs to switch back to Xcode as an inexperienced Cocoa developer may get confused here.

2008-11-20
112112SUGGEST

You mention here a good caveat for those new to Cocoa; inherited methods are not listed in the docs of any given class.
This would likely be an excellent place to mention tools such as the AppKiDo. AppKiDo is a quirky but often useful class browser that will give the Cocoa coder a quick lookup to see class and instance methods as well as inherited methods. This tool is free and especially useful as one gets more comfortable and familiar with Cocoa and just needs to locate the method or confirm it or is looking for something in particular.

The fact that so many methods are somewhat predictable, after getting familiar with the design patterns of Cocoa, that it becomes easy to begin looking for useful methods by method prefix or return type.

2008-11-20
52TYPO

Misspelled as “Controler” in image at bottom of page.

2008-11-20
108ERROR

I could be wrong here, but it seems with the XCode included with Leopard, there is no “Wrapping Text Field”; instead there is only a “Text View” and the normal text field. It is not too difficult to figure out how to change things to make it work with the Text View, but you may want to mention this.

2008-11-20
52TYPO

“Controler” should be “Controller” in the image.

2008-11-20
56TYPO

I found the “Isn’t that cool?” out of place here, I didn’t know what you were talking about until I read the next sentence. Perhaps move it after the 2nd sentence.

2008-11-20
60TYPO

I originally missed the one line about moving the resetButtons method above the other methods and spent quite a while trying to figure out why it wouldn’t compile. Can you make a bigger deal of this, and explain why the method needs to be before the others? If resetButtons was declared in the header file would that still be the case? It’s particularly odd for java programmers where this is not needed.

2008-11-20
62TYPO

My SimpleBrowserWithController always crashes after I enter the 3rd URL with “status 2”. How can I debug? I tried looking up “status 2” in the docs, and it was completely useless.

2008-11-20
62SUGGEST

Sorry, the error I previously reported for this page was actually because I happened to pick some web pages (each on the 3rd URL!) for trying with SimpleBrowser that cause it to crash (Amazon and Yahoo both do this). But that brings up the question of debugging - Perhaps an add on section to this chapter to 1) have the user do something that will cause a crash and 2) some simple debugging techniques to help, eg. how can I add some basic print statements to the code that will print helpful stuff to the console? What other debugging techniques might help if I’m running into trouble? It seems like we’re far enough into the programming at this point that it would be helpful.

2008-11-20
18TYPO

Building the Recipe Source List
The first part of this inter face that we are building is in the upper right
cor ner.

This should be “upper left corner”

2008-11-20
18ERROR

Sorry, the error on page 18 was for a different book

2008-11-20
64SUGGEST

I find 5.1 very confusing - “You don’t subclass a button to assign its target and action”. Why did you say that? It didn’t occur to me that I would need to, and so saying that makes me wonder what I’m missing. The next paragraph also is confusing. The “On the other hand” point doesn’t make sense to me as being related to the first paragraph, so the fact that you say “on the other hand” seems odd. And I’m not sure what this has to do with buttons and the problem I’m trying to solve with this chapter (ie, getting the back and forward buttons to work). I feel a bit lost by the 3rd para. And in the 4th para, I think you’re trying to explain what delegation is, except that it feels like you are telling me what delegation is using “delegation”. I think delegation is a really important concept and deserves a picture and a better explanation. The explanation here is all confused with UI responses to close actions and buttons, etc. At the end of 5.1, I really have no idea what a delegate is, and I’m confused about what I’m trying to do.

2008-11-25
65SUGGEST

Section 5.2, second paragraph. “Start by connecting the delegate…” This made no sense to me. What delegate? Probably because I am still very confused about what a delegate is and how it relates to the web view.

When you say “Select the web view” - it’s not actually clear to me at this point what you mean. I figured it out, but it wasn’t obvious.

It also took me a while to figure out that the didReceiveTitle:forFrame wasn’t an instance method on the web view, but on the web view frame load delegate. I hunted around in the docs for a while looking for it in web view, before clicking on frameLoadDelegate under Getting and Setting delegates, and then clicking on WebFrameLoadDelegate in the definition and then finding the instance method there. I think it would be really helpful to explain all this in a lot more detail because the fact that it’s described as “webView:didReceiveTitle” makes me think that it should be a method on webView. And how do you know when something is a method on a delegate or on the real thing? How do you find out so when you are looking in the docs you know where to look??

And “You can see that the message we receive also includes the title as a parameter…” - how can I see that? I don’t see it until I read the next page and see that title in a parameter in the method signature, which you say you copied from the WebFrameLoadDelegate protocol documentation, but you haven’t told me how to find this.

At this point, I should point out that one of the things I struggle with the most when it comes to Cocoa and Objective C is how do you know what you need and when? It seems a complete and utter mystery to me and it’s why I’ve never learned cocoa better (because there are few books on the subject and they all seem to gloss over this point). As a relative “newbie”, I find this incredibly frustrating about Cocoa. The framework and Obj C language seem so incredibly powerful and interesting and yet it’s like you have to know all about it in order to understand it and there is such a steep learning curve and no great documentation about how to know this stuff. Argh! I would love it if your book could help with this… There is (from what I have seen) NO book and NO documentation and NO online resource that addresses this effectively.

2008-11-25
66SUGGEST

Top bullet: “We don’t need to add anything to the header file”. Why? Is it because (with my Java hat on) we’ve essentially just made SimpleBrowserController implement the interface of the delegate? Even so, it doesn’t seem right to me that there is no indication in the code that somehow I’ve done this, either in the header by declaring the methods, or in the class file by showing that it’s now a delegate.

2008-11-25
66SUGGEST

Sorry, more on the previous entry - if there is no indication in the code for a class that it’s acting as a delegate, how I can know by looking at some code that it is indeed doing so?

2008-11-25
81TYPO

Typo in the NSLog statement in the sample code. “Hellow, world” should be “Hello, world”

2008-11-25
81TYPO

Keyboard shortcut for Build & Go is command-return, not option-command-return as stated.

2008-11-25
66TYPO

Then you just ask this window to set it’s title - it’s should be its.

2008-11-25
95TYPO

bottom of page: “…pull out these two lines into a seperate function.” - should be “three lines” (there’s a third line of code at the top of the next page)

2008-11-25
52TYPO

Seriously anal, but there are two different dashes (an n-dash and an m-dash, I think) in the bulleted list after Actions and Outlets, respectively.

2008-11-20
71SUGGEST

What do you mean by “template” code in the text just beneath the code on this page? Is there a special meaning to template? I would suggest that if it’s important for me to know what a template is right now, then go ahead and explain it, otherwise, take “template” out and explain it later.

2008-11-25
72SUGGEST

The bullet item “The notification object is passed in as the method’s single argument.” makes me wonder if there is something missing from the code. I don’t see where or how we are specifying the “notification object” in the example code. It feels like there is something missing between the line that has “selector” and the line that has “name” - this list item seems to correspond to that line, which would be a way to pass in an object. ???

2008-11-25
72SUGGEST

What’s the difference between a “notification object” and the “object whose notifications I am interested in”?

2008-11-25
72TYPO

In 5.7, 2nd para, 2nd sentence. “They” is unclear. In the previous sentence, you mention the second controller object (an “it”) and the nib (also an “it”). Thus, I’m not at all sure what “They” is, so I am not sure what is part of the object graph.

2008-11-25
72SUGGEST

5.7, 2nd para, 3rd sentence. “the basic pattern” for what? Very confused about what this is. This whole second para feels like it should be expanded a lot with a lot more explanation about what we’re talking about, and make it make sense in the context of “registering for notifications before the user takes any actions” which is what I’d expect given the first para of the section.

2008-11-25
73SUGGEST

Why do we need a second controller? Could the SimpleBrowserContoller also do the work we’re putting into the LoadIndicatorController? (just a question that came into my mind when I saw 5.8).

2008-11-25
75SUGGEST

After I changed the name of webView to pragWebView, I was not able to build and go at this stage, because I get two build errors. They appear to be in LoadIndicatorContoller.m, and one error that I found says: syntax error before WebView.

One question I have at this point (other than what is missing in LoadIndicatorController such that it won’t compile), is this: I had SimpleBrowserController.m open when I did build and go as instructed in the book text, and other than the status at the bottom of XCode that I had two errors, there was nothing in the interface that indicated where those two errors occurred. So I had to click through all my .h and .m files to find it. If I had a lot of code and/or the files were long, that would be a pain in the you know what! Is there a way to turn on something in XCode so the files that contain errors are highlighted? Or see a list of the errors so I can click on them and jump to the corresponding file?

Second question: when I click on the error in the file, it just closes it. I was hoping it would get me more information about the error. Is there a way to get more information on errors?

2008-11-25
75SUGGEST

After changing the name back to webView from pragWebView, I build and go and still get the error mentioned in the previous errata. I didn’t do anything to change this file after creating it following the instructions in the book.

2008-11-25
75SUGGEST

Oh I just figured it out, I didn’t link to the web kit. Might be good to have a reminder! :-)

2008-11-25
75SUGGEST

I think it would be great to have a reminder of what the difference is between goBack and goBack: - at this point I’ve long forgotten what the distinction is and we haven’t really used that distinction anywhere yet.

2008-11-25
76SUGGEST

The para beginning, “There are two other places…”. Can you just give an example of a notification set up here? As a newbie, no, I’ve never seen sample code like this (or if I have, I am not sure and am not sure what you’re referring to), and two, since we haven’t actually done the “passing the notification name in” yet, it’s very hard to understand what you’re talking about here. Showing an example, or talking about this after you’ve shown the code we’ll use to do this, would be better I think.

2008-11-25
78SUGGEST

Couple of things on this page:
1) I saw you answered my question about whether we can use the SimpleBrowserController for this. Do you think this is a natural question someone would ask? If so, then I think a more in depth explanation for why we don’t use it would be great, plus if we can use it, more detail about how that would work.
2) I looked and looked in the NSProgressIndicator class for a method that had something to do with hiding and showing the progress bar but didn’t see anything. Again, I find this a frustrating thing about Cocoa (or perhaps it’s Objective C) - that it is hard to know what is possible on an object without understanding the entire class hierarchy. Perhaps this is intentional? Anyway, I think it would be worth saying something in the text about the fact that the setHidden method is in the parent class, not in the progress indicator, why it’s there, how to know when to look for methods in the parent class, and what’s the best way to learn all these classes for a newbie.

2008-11-25
80SUGGEST

At the bottom of the page you say “stop the tasks from within XCode” but you haven’t told us how to do that.

2008-11-25
81SUGGEST

Given we didn’t use main.m at all in the previous example, I think it would be helpful to have something in here about main.m - what it is, why we didn’t need it before, what it’s used for, why we need it now.

Also, I think it would be helpful to change the order of the list of items about the console so that “Show the console” is first. When I did the RUn > Clear Console, nothing happened. I didn’t see anything until I did Show the Console.

And finally, will most programmers, like me, find it completely odd that strings require an “@” in front of them? For programmers coming from Java, and probably other languages, I think they might. Perhaps a word about what that is and why we need it?

2008-11-25
82SUGGEST

2nd para on this page is very confusing, suggest rewriting.

2008-11-25
83SUGGEST

Question: why does the call to sayHello not use the “:” at the end, as in [Greeter sayHello:]??

Question: why do we need to import Greeter.h since the files are in the same “package” (in Java speak)?

2008-11-25
84SUGGEST

Nice feature with the line numbers - maybe an aside box telling us how to turn on line numbers in Xcode?

2008-11-25
86ERROR

When I navigated to HelloWorld/build/Release/, all I saw was:

HelloWorld (no extension)
and
HelloWorld.app.dSYM

I didn’t see: HelloWorld/build/Release/HelloWorld.app as described on this page.

2008-11-25
86SUGGEST

It wasn’t clear to me when the “leak had been reported”. Is it when I see the red triangle appear in the “leaks” instrument? Maybe a little more info about what to look for, or a screen shot would be great here.

2008-11-25
87SUGGEST

Oh! Guess I should look ahead before writing a suggestion, I see the memory leak screen shot on the next page. Oops. Perhaps a reference to the screenshot in the text??

2008-11-25
88SUGGEST

I think the example at the bottom of the page is worth expanding a bit. Given how tricky reference counting can seem to people used to languages with garbage collection, or dynamic language, or even pointer-based languages, it would be helpful. So show the entire code for a situation where you’ve created an object and now need to set it, and step through it carefully. The memory management piece is an area of teaching I think bears repetition to make sure we truly get it.

2008-11-25
91SUGGEST

I’d like to be able to try this sendBackAGreeter code, but I can’t figure out where to put it. If I put it in main, I get an error saying it needs to be inside an @implementation. Main is weird. It’s not inside an implementation and I just realized I have no idea why. If I leave off the “-” in front of the method (so it looks like main) then I get a whole host of errors I don’t understand.

Would be nice to expand this whole example and show it working with the previous Greeter example and along the way explain: how to put another method in main, why main isn’t in an implementation block, etc.

2008-11-25
91SUGGEST

The following text:

Every object has an isa variable that points to the object’s class.
This is how you were able to find myGreeter’s class. This value is
set by alloc.

makes absolutely no sense to me. Why did I need to find myGreeter’s class? When did I do this? How does this relate to myFoo? Why is it important in understanding alloc?

2008-11-25
111TYPO

Last sentence on the page: “The docs contains in depth descriptions
methods defined…” should be “The docs contain in depth descriptions of methods defined…”

2008-11-20
92SUGGEST

I’m really having trouble following the paragraph beginning with “Let’s set the value…”. Let’s set the value of what? I find out in the next sentence, but it makes it harder to read. Would be good to remind me exactly what “init” does if we’re going to implement our own version of it. In the second to last sentence of the para, I’m not precisely sure what “it” is.

Also on this page, you use “template” again. I’m confused about template and protocol and I’m not sure that you’ve explained them? At least not to the extent that I really get what they are.

2008-11-25
94SUGGEST

Joe / Beth asks - do we have to implement dealloc if we implement init? Or does the built in dealloc still get called? If we don’t implement dealloc, could we put the release in the sayHello method?

2008-11-25
121TYPO

First paragraph: “…drag a Custom View from the Library into your main menu.” Should be “…from the Library into your main window.” ?

2008-11-20
132ERROR

Method is referred to as initializeIconView in the text, but is depicted in the screenshot as -initializeIconAndView

2008-11-20
132TYPO

Last sentence on page, “create instantiate” should be “create and instantiate”?

2008-11-20
44SUGGEST

Section 3.6;
You might want to let readers know not to worry about what IBAction and id mean.

2008-11-25
53SUGGEST

It might be worth pointing out that IBAction and IBOutlet compile to nothing, but are used be Xcode to tag outlets and actions for IB.

2008-11-25
61SUGGEST

Regarding the resetButton method.

If you cover Categories later in the book, you could refer back to here as an example of when to use a private category.

2008-11-25
95SUGGEST

I’d suggest making sure you don’t get page breaks in the middle of code if at all possible.

2008-11-25
96TYPO

“Select those two lines” should be “Select those three lines” I think.

2008-11-25
97SUGGEST

I think the para that starts “Note in line 13…” needs a little bit more. This also gets back to an earlier suggestion that it would be helpful to understand what “main.m” is - it’s not a class or object in the same sense that the other classes we’re creating are, so what is it? If I want to use [self greetTheWorld] I can’t (I tried) - presumably because main is not a class. I feel like the last sentence just leaves me hanging…

Sort of related question - can methods in objects be declared and used in any order? It’s clear that greetTheWorld() needs to come before main. But what if I had a class and put the method declaration (I don’t think that’s the right word for it though) in the .h file, could I then call it even if the method is implemented below the method I’m calling it from? Looking back at SimpleController.m, I had to put resetButtons above the method it was called from but I didn’t declare resetButtons in the .h file. Why is that??? If I had declared it, would I be able to call it even if it’s implemented below the other method?

2008-11-25
97SUGGEST

The sentence “If we could only reset the greetee we could greet anyone we want”. I don’t know what that means, mostly because I don’t know what “reset” means in this context.

2008-11-25
98SUGGEST

In the solution, where you describe initWithName, I think it is really important that you explain the [name retain] bit. This is really the first time we (as students) have used retain like this and it’s confusing! At least it is for me - I didn’t know to do this in my solution until I saw your solution. I get why now, but wouldn’t have thought about it on my own, and having another reminder of what is going and why we do this here would be really helpful. [Note from my HF self - repetition is key to learning! :-)]

2008-11-25
99SUGGEST

I think this part would be a lot more clear if you just used the set and get with greetee instead of foo. Foo is too abstract and meaningless - I have to do too much work in my brain thinking about foo which is distracting from the getter and setter parts. So if you just go ahead and use setGreetee or setName or something all the way through, I think that will make this example a lot more clear.

2008-11-25
99SUGGEST

Also on this page, at the top (actually, the para that starts on the page before) I need a little more connection between the sentence ending “… is exactly what you want” and the last sentence. You’re leaving too much unsaid here. Basically you are talking about two different ways to get values into properties in an object right? So let’s just come and be much more explicit about it. I had to read that para twice and really think hard to make sure I was getting what you were trying to say. Perhaps it’s just the way it’s written or perhaps it’s the paint fumes in my house at the moment, but I thought this was confusing on the first read.

2008-11-25
99SUGGEST

In the sentence “Or, if you are using at least Objective C 2.0…” - I’d suggest saying “Or, if you are using Objective C 2.0 (or greater) …” It might be a little clearer.

Also in that sentence, the “syntactic sugar” myGreeter.foo is equivalent to [myGreeter foo]? Are you introducing this here because it only works with getters and setters? If so, then say that right up front rather than waiting until later in the page. (Not the part about declaring in the header file, but just the syntax equivalence and the fact that it only works on getters and setters).

Do you use this? It seems odd to me… like too much syntax. I’d rather just use the same syntax as on other method calls so I don’t have to try to parse both if I’m reading a file that has both types. (Not suggesting you take it out, just curious).

2008-11-25
99SUGGEST

Why aren’t all methods declared in the header file? At this point I’m really confused about what needs to go in the header and what doesn’t. We didn’t put the SimpleBrowserController resetButtons method in there. We did put initWithName in there. And now you’re saying that we have to put the getter and setter in there if we want to use the dot syntax… very confused…

2008-11-25
100SUGGEST

I’d suggest removing the phrase “stripping the time code and identifiers as usual” from that sentence at the bottom of this page.

2008-11-25
102SUGGEST

I read the first half of the exercise on this page, but had to skip forward to the solution as I got stuck (I got stuck on the controller - I created an NSObject in IB, but when I “saved” I couldn’t find it in XCode). So when I got to the solution, the first sentence made no sense to me. So you might want to repeat some information here so it makes sense whether you skip part of the exercise or not.

Also, the second sentence needs more explanation. Why do we not need the init methods anymore???

And I’m a little unsure why the solution starts with the reduction of code. I’d expect to start with a talk through of adding the Controller. Seems like the code reduction could come towards the end?

2008-11-25
103SUGGEST

I don’t understand the paragraph beginning “We could reduce the footprint further…”. Eliminate what instance variable? I think since we’re not changing it, don’t even mention it. Or, show it.

2008-11-25
103SUGGEST

Ah, I am thinking maybe I should have created GreeterController in Xode instead of IB? I’m confused. I think elaboration on this point is needed. I thought we could create NSObjects in IB, but maybe I’m misremembering or confused about what we create where. I’ll try it in XCode….

2008-11-25
103SUGGEST

Noticing in XCode that all the classes I created (main.m, Greeter.m, Greeter.h) all went into a folder called “Other Sources”. What is that? Why not in classes? But when I went to create GreeterController it went in classes. What’s the deal with folders? Does it matter which one the classes are in, what the folders are called? Can I create my own folders? What’s the advantage of folders? In what situations would they be important?

2008-11-25
103SUGGEST

I think the solution should repeat a bit from the exercise, ie step me through what I’m doing when I’m adding issueGreeting for instance and remind me that it should be hooked up to the text field. I think a little repetition here will really help. Otherwise, I have to go back up to the exercise to remember what each thing is.

2008-11-25
102SUGGEST

Why are we turning on automatic garbage collection?
What happens if we don’t?
Are there things about the GUI based program that leave object references out there?

2008-11-25
105SUGGEST

Suggest removing first sentence of this chapter and modifying the first para. That wasn’t boring to me, it was interesting and challenging.

2008-11-25
128OK

Footnote 3 at bottom of the page is formatted so that it is justified to both the left and right margins, causing the words to be spread across the page, and link address runs off the right side of the page.

(Dave says: we handle this kind of thing during the layout phase at the end)

2008-11-25
18SUGGEST

At the beginning of section 2.1, you write “As we bounce back and forth between IB and Xcode …”. I suggest you make a link between the acronym IB and the complete name “Interface Builder”. Not really mandatory, but it is cleaner IMHO.

2009-01-05
86OK

I’m using XCode 3.1.1 and Leopard on a 15" macbook pro and I can’t successfully build the “leaky” test. I’ve since finished the chapter and was able to “see” the use of Instruments as I finished your additions and was using Instruments after every addition. But, the first “leaky” release would not build successfully and Instruments would get an error with the “ignore-or send to Apple” dialog. GDB prior to even using Instruments would show the leak. I got the point but the steps didn’t work as written.

(Daniel says: I can’t reproduce this)

2008-12-04
13OK

In:
It helps to reread Alan Kay’s 1998 reminder on Squeak mailing list every now and then “that Smalltalk is not only NOT its syntax or the class
library, it is not even about…

Note the capitalized “NOT”.

2008-12-04
105OK

I’d remove the sentence “The Cocoa frameworks commonly share information using…” from the end of the last para before 7.1. It seems out of place and raises too many questions at this point - better saved until you actually start talking about dictionaries.

2008-12-04
105OK

I’d suggest repeating the previous notification method call from the previous example at the beginning of 7.1. It’s been long enough I’ve forgotten the details and it would be really helpful to see it again to refer to as you go through the explanation.

2008-12-04
106SUGGEST

I’d suggest adding a list of the “three instance methods” for NSNotification - first sentence on the page. Otherwise I’m wondering if I should already know what those are? No, I could look them up in the documentation, but it would be easier for you to just name them right there.

2008-12-04
109SUGGEST

A few things about the code not addressed in the explanation.
1) You must explain why updateConsole: is being used with the “:”. I don’t feel like an adequate explanation of the whole “:” vs. no “:” was given and so this is very confusing and I believe this may be only the second time? or perhaps even first? we are using it this way deliberately.
2) I think it would really help to step through the calls to get the notification center and explain what’s happening as well as what a notification center is and a NSWorkspace is in more detail. It’s rather vague like okay I can take your word for it, but I’d never in a million years feel confident about using this on my own because I really don’t understand it.
3) The bit in the foot note about getting the string description of the userInfo data was unsatisfying for me. Passing in a dictionary value that I have no idea what the value is because I don’t understand dictionaries yet and assuming it will magically get a string out - that is also way too hand wavy for me. Even if you don’t want to address it now, do say something about it in the main text and don’t leave it for a footnote. In the main text you say “The string representation of userInfo” - that’s just way too loaded and my brain is like huh? so it’s a big hang up for me. I don’t know enough about dictionaries to really get it yet, but I do know that statement carries a lot of information that I don’t get yet.

2008-12-04
67TYPO

“5.4 Solution:Updating the URL and Setting Buttons”: a space is needed between “Solution:” and “Updating”.

2008-12-04
110OK

“those awkward names” - probably worth repeating what they are here since you haven’t referred to them in the text. It took me a second to know what you were referring to.

2008-12-04
110SUGGEST

“We’ll also ignore…” Rather than thinking about what we’re not going to do, can you reword to say something like “Instead of printing the entire dictionary to the console, we’re going to just pull out the name of the application which we can get from the dictionary entry NSApplicationName” or something like that.

2008-12-04
11TYPO

the cocoa-dev link doesn’t work

2008-12-04
91ERROR

Foo * myFoo;
myFoo = [Foo alloc];
[myFoo init];
The third line should be:
myFoo = [myFoo init];
as the init: method returns the initialized object (which may be, though it usually isn’t, different from the object that received the message).

To keep with this, you should also, to:
" The init method is an instance method that is used to initialize the
instance variables of the myFoo object and per for m any needed
initial configuration" add “and even substitute another object for the one returned by the alloc method”.

2008-12-04
73TYPO

The footnote should read: “No message is sent to objects that don’t implement this method…”

2008-12-04
110SUGGEST

NSWorkspaceDidLaunchApplicationNotification and NSWorkspaceDidTerminateApplicationNotification are already defined as external strings inside Cocoa, and you’re supposed to use the key’s names, like this:
nameLookup = [[NSDictionary alloc] initWithObjectsAndKeys:
"Launched", NSWorkspaceDidLaunchApplicationNotification, “Terminated”, NSWorkspaceDidTerminateApplicationNotification,
nil];
This makes the contents of the key strings irrelevant, and ensures you use the same keys the framework uses internally. Use actual strings as keys only for custom notifications.

2008-12-04
125TYPO

launchColor = [NSColor greenColor];
terminateColor = [NSColor redColor];
viewColor = [NSColor whiteColor];
While these colors may well be singletons or frameworks constant, you shouldn’t make the assumption they’ll stay around forever (some more complex color might be returned autoreleased from such a convenience method). Since you want to keep them for later, they should be retained.

2008-12-04
72TYPO

third paragraph has a word missing from the following sentence: “Sometimes, though, you’ll a class has multiple delegates.” I assume it should be “Sometimes, though, you’ll encounter a class has multiple delegates.”

2009-01-05
45OK

Would you consider adding the chapter or some other identifying reference to the appropriate section for footnotes referring to Apples Objective C 2.0 docs? Would be really helpful, reduce look up time. E.g. For more information read Apple’s “…”, “Selectors” chapter, section “Methods and Selectors” (or something similar). Although I guess the downside is if Apple changes their docs you’d have to change the book. Maybe have this info online?

2009-01-05
70TYPO

In the last paragraph, WindowHelper.h is spelled without capital H, as Windowhelper.h

2009-01-05
66SUGGEST

I’m not sure how you came to know that [sender window] will give you the parent window. I don’t see this in the Apple documentation, you just kinda jumped to this conclusion. A few more bread crumbs in this area would be nice.

2009-01-05
65SUGGEST

Last sentences read better in Oct release: “two mechanisms of capturing and responding to these otherwise invisible events. Delegates will let us customize behavior for a class without creating a subclass. Notifications let us (and anyone else) listen for updates that we might want to respond to.”

2009-01-05
82TYPO

In the 4th bulleted item that begins ‘The object refers to’ the second sentence has an extra comma.

2009-01-05
106TYPO

2nd sentence says “Select those two lines…” when it should say “Select those three lines…”

2009-01-05
145SUGGEST

Please describe the .h changes before the .m changes.

I was wondering if I missed the step where the NSImageView gets moved from the controller to the view, and I looked all the way back before looking to the front. Sorry, the book got me used to being spoon-fed the changes :)

P.S.: Thank you so so much for taking the time to write this book!

2009-01-05
170SUGGEST

I got away with less book-keeping by creating both view controllers, relaying notifications to them all the time, and using replaceSubview to swap the views from the window.

I’m not saying it’s better than your solution, it’s just an alternative.

2009-01-05
98TYPO

The sentence:
“The retain count is set to one when alloc is called.”

should be:

“The reference count is set to one when alloc is called.”

2009-01-05
103TYPO

In the “Joe asks”, there should be a space between the self and the = for parity with the code below. Otherwise, your prompt “At first it appears we may have typo in” is actually true!

2009-01-05
121TYPO

Need to capitalize “english” in:

“We can build a simple example of how you might use one that uses the notification name as the key and the more accessible english ter ms as the values.”

2009-01-05
166TYPO

“we set the window to be resize to just surround the view we’re passing in.”

“resize” should be “resized”?

2009-01-05
142SUGGEST

This is the first time we do an if statement and an equivalency test in the book. It would be nice to discuss the way equivalency works in Obj C — for instance, why are we using isEqualTo here instead of == ?

2009-01-06
154TYPO

There is a typo in the string describing the project name of MainWindow.xib

““HellowApplicationNibs.xcodeproj”."

Should read HelloApplicationNibs.xcodeproj".

I made the same typo when creating the project.

2009-01-05
163TYPO

BorderedIconView.h misses declaration of launched: and terminated: which generate build warnings.

Same with MessageField.h on page 162.

2009-01-05
160SUGGEST

Need to specify that you should drag the NSObject for HelloApplicationNibsDelegate into the MainMenu XIB’s document window. Currently doesn’t say which XIB to use.

2009-01-05
16TYPO

1.5 In this book

“This and the rest of the Introduction will be added as the Beta process continues.”

… " will be added to as the Beta process continues."

2009-01-05
100SUGGEST

In the first paragraph, there is a run-on sentence beginning with the double-negative “You can’t do nothing or you will have a memory leak…” This would be more clearly stated beginning with a positive statement and splitting it up into two sentences. ( “You must do something to avoid a memory leak. In case of…” ) I had to reread that sentence a few times to really get what you were saying.

2009-01-05
185TYPO

“It’s safer for you to choose a suffix for your methods” —> do you mean prefix?

2009-02-24
71TYPO

Last sentence before paragraph 5.6 title should read “These are both called too late […]”

2009-02-24
85TYPO

“…what language you come from, you’ve should know not…”

“you’ve” should be “you”

I won’t point out the irony that this is in the section called “Spelling Counts”. :D

2009-02-24
98TYPO

“You can’t do ignore the reference you hold…”

should be:

“You can’t ignore the reference you hold…”

The “do” is a typo.

2009-02-24
29OK

I was unable to run the application until linking the WebKit.framework back in Xcode. This is the error I received:

1/11/09 7:58:45 PM SimpleBrowser[4308] * -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (WebView)

2009-02-24
70TYPO

5.4 Exercise: Turning the background green:
“Implement this method so that the window does not close”

Should probably be:
“Implement this method so that the window does not change size”

2009-02-24
80TYPO

I am not a native English speaker, but I would consider rephrase “_You will also may
get other_ information that you need to act on the notification” to “You may also get other”

2009-02-24
98TYPO

Questionable grammatic practise: “You can’t do
ignore the reference you hold for myGreeter.” I would skip the “do” part of the sentence, or rewrite it to be more explanotory.

2009-02-24
171TYPO

first para, sentence “You should notice that the application runs just as it did
before but the compiler is war ning that something might be wrong witht
he code.”
should probably be “You should notice that the application runs just as it did
before but the compiler is war ning that something might be wrong with the code.”

2009-02-24
24TYPO

Third last sentence: That’s the the one with… Doubled the

2009-02-24
113OK

dealloc for class Greeter is missing, so the instance variable greetee is never deallocated. As I write this, I discovered that you wanted us to turn on garbage collection (second last paragraph of 7.12, just above the code for main). Hm. Since this is an easy fix, I would recommend not to turn on GC, instead use the dealloc class method (in fact there is no ambiguity in this case, since it is obvious when dealloc has to be done). So I recommend to leave dealloc for Greeter in, and to add a dealloc method for the GreeterController like this: - (void)dealloc { [changeableGreeter dealloc]; [super dealloc]; }

2009-02-24
114SUGGEST

The last paragraph on this page - I think you can lose the first sentence.
“Every notifification object contains two or three pieces of information”.

2009-02-24
73TYPO

“Unfortunately, if you look in the WebView documentation. You have to
look at the superclass NSView and you will find the window method.”

I think this is poorly worded.

2009-02-24
183TYPO

-(void) terminated: (NSNotification *) notification {
[() view terminated:notification];
for (NSView *sv in
[view subviews]) {
[sv launched:notification];
//should be: [sv terminated:notification];
}
}

2009-02-24
185TYPO

“it” should be “if” in the second sentence of the last paragraph on page 185:

“What it there already are methods with those names?”

2009-02-24
109TYPO

Existing text: “Here is the method we’ve added to main.m.” (talking about greetAnotherPerson)
Should be: “Here is the function we’ve added to main.m.”

2009-02-24
16OK

I’m confused with page numbers referenced in Erratum. Currently I’m on page 16 of the PDF — none of the above Errata references reported for this page, show up on this page. Perhaps as errata is implemented into subsequent versions of the PDF, they should be deleted to help alleviate confusion.

(Dave says: when fixes are made and a new version is released, then the errata disappear from the default list—you have to select the prior release of the book to see them)

I like this concept of a BETA book! It should reduce the number of errors that often slip into first editions of a technical book. Sweet!

2009-02-24
21OK

Update the graphic on PDF page 21 to match the project. The graphic shows a project window for “SimpleBrowser”, but we just created a new project called “UsingWhatsThere”.

2009-02-24
96TYPO

Change sentence “The first is any prior versions of OSX.” to “The first is any prior version of OSX.”

(First paragraph on the page.)

2009-02-24
104TYPO

Change “Both instances of myGreeter are highlighted.” to “All instances of myGreeter are highlighted.” The term “both” implies two instances, and there are three in this example.

(Third paragraph on page, right below the figure.)

2009-02-24
214TYPO

“Now what can we’ll set the background color of our table by reading the defaults.” This sentence doesn’t make sense.

2009-02-24
119TYPO

The code instructions in section 8.3 are not clear, as to what I should be adding/modifying to the existing code in ActivityController.m. To me, it would be clear if you were told to add the setUpNameLookup method; in the text, it mentions that this is a “code example”. To me, a code example is as stated: an example. I skipped over it, and then noticed that it was actually needed when I modified awakeFromNib.

2009-02-24
145TYPO

The “initWithFrame” stub in my MessageView.m file is different from what you show in the example. I created my class file following directions. Is there a reason you modified the code to simply return the expected value? My guess is you didn’t ever plan to add any additional initialization code, and your example is the result of refractorization.

2009-02-24
125SUGGEST

Slight suggestion: recommend that “#pragma mark” be bolded in black text instead of just “#pragma”. This will match the default color scheme of the Xcode 3.1 IDE. Great idea covering #pragma mark in the book. Thanks!

2009-03-26
145SUGGEST

In 9.9 Solution: Prepare to Draw Text —- the step to delete the text field from our GUI window in Interface Builder is omitted from the solution steps. It instructs you to do this in 9.8 Exercise: Prepare to Draw Text. The solution would be clearer if it contained this step after modifying ActivityView.m to create and configure the MessageView subview.

2009-02-24
148SUGGEST

Suggestion: For the footnote #2 on the bottom of the page, I suggest you have the user search on NSAttributedString(AppKitAdditions) in the developer documentation. The listed URL is too long to display correctly on a printed page. For the PDF version, you could still link to the URL from the suggested search text above.

2009-03-26
129TYPO

“Again, as an example, this will return /Applications/iCal.app then iCal is launched or terminated.”
Should be: “… when iCal is launched or terminated.”

2009-02-24
71SUGGEST

On page 48 note 2, the author assumes we are working with a new Project : “SimpleBrowserWithController” when implementing the SimpleBrowserController class.

So it would probably be more coherent if “Close the WindowDressing project and re-open our SimpleBrowser project.” read Close the WindowDressing project and re-open our SimpleBrowserWithController project." instead.

2009-02-24
155TYPO

“Why are their two endings?” should be “Why are there two endings?”

2009-02-24
101TYPO

At the top of page, second sentence: “ending, it is a good to get in the habit” should be:

ending, it is good to get in the habit

OR

ending, it is a good idea to get in the habit

2009-03-26
169OK

In the paragraph after the code fragment, you say to create a new View XIB file, but you had said this before on page 168 under heading 10.10.

2009-03-26When we didn't include it in the solution people complained so it's both places.
170TYPO

I may have missed it, but I think you fail to mention that the reader needs to open IB and set the window’s delegate to MainWindowController.

2009-03-26
135SUGGEST

When describing how to put a custom view behind the image view and the text view you could also select both items using the cursor and then use the menu command Layout | embed objects in | custom view to do the same thing.

2009-03-26
140TYPO

The formatting for the setToLaunch… setToTerminate… is a little messed up.

2009-03-26
144TYPO

There is a space between the last bracket of (void) and the setImage (the last line of code). Inconsistent with the lines of code just above.

2009-03-26
147TYPO

in the listing for ActivityView.h the setImage and setMessage declarations are not spaced the same way as the code above.

2009-03-26
126OK

IMHO, I would drop the whole #pragma stuff, because the book is about Cocoa programming, not features of the IDE. The #pragma discussion - although describing a useful feature - helps not in understanding the chapter topic, which is “Working with dictionaries”.

2009-03-24
167TYPO

Second Paragraph last sentence. Should be…

“…between now and the end of this chapter.”

2009-03-26
150TYPO

No a typo, per se, but the formatting of footnote #2 is horrible. The blanks between words are far to wide,

2009-03-26
170ERROR

Not really an error but in the implementation of the MainWindowController you declare the currentViewController to be of type ActivityViewController, but when you declare it as a property, you give it the type NSViewController.

Again, not an error, but I think it’s inconsistent.

2009-03-26
194TYPO

Penultimate paragraph of section 12.4:
“… Cast this object to an NSDictionary an pull of f the value with the key NSApplicationName.”

‘an’ should be ‘and’.

2009-03-26
243TYPO

The first word in the last sentence on page 243 (PDF v1.06) reads “UpOfDown” instead of “UpOrDown”:

“UpOfDown will need an outlet to connect to the Display and an action method.”

2009-05-28
248TYPO

Typo on the middle of the page: “UpOfDown” should read “UpOrDown”:
“Here’s how you would modify UpOfDown to use KVC.”

In addition, there might be another typo in the last sentence of that page (but I’m not really sure): “setName:” should read “setCount:”:
“I’m using dot syntax here but you could also use setName:.”

2009-05-28
57OK

It is instructed that the user add to the SimpleBrowserController header file.

It should also be noted that the user has to link the WebKit framework in the project.

2009-05-29Exactly. That's the point of the explanation that follows.
56SUGGEST

Daniel,

I’m not sure where you could place an expanded version of your explanation of Actions/Targets/Outlets, but I am sure that a more complete explanation of some key Objective-C underpinnings would be very useful up front in your book. Introducing NSControl would also be useful.

Hillegass spreads out these CONCEPTS in short sections early in his book,
on pages 62-63 for messaging, SEL and obj_msgSend(),
on pages 79-80 for controls and their target, action and sender, and
on page 90 for setting the target programatically.

It is also VERY important to continually illustrate that while some powerful results can be easily obtained working solely in Interface Builder, those same results can be obtained and sometimes MUST by directly coding in Xcode.
Also, really understanding up front what NSObject can do would be a big learning help for a beginner.

How can your control-drag between
objects in IB be duplicated in Xcode?

NSOject protocols?
[target performSelector: @selector (buttonClicked:)
withObject: self ]

And a little about the compiler would be useful.

What do IBOutlet and IBAction “hints” do under the covers?

Hillegass is pretty good at getting this basic stuff in early.
You need to do the same.

Thanks in advance for any changes you might make along these lines.
Thank you very much for your wonderful book.
I am loving it!

SteveJ

2009-07-23Thank you and it was good talking to you at WWDC. These points will be mostly addressed in the Snow Leopard rewrite.
51TYPO

A sidebar CAN be very useful in SOME CASES,
but it should NOT be used on this page.

I think your explanation would flow much more smoothly,
if the information now in the sidebar were presented,
NOT as an side comment to be read OPTIONALLY,
but rather as the first four NECESSARY steps
needed to complete the exercise that begins in Section 4.1

In other words, please remove the two paragraphs from the current sidebar and make them the first two paragraphs of Section 4.1.

I skipped the sidebar on my first time through the text
and by not using those steps in the subsequent exercise,
I was completely stumped for quite a while.

I recognize that it was my fault for skipping the sidebar,
but am fearful that some other “fast readers” may do the same thing".
Help us, please.

Excellent book.
Thanks.

SteveJ

2009-05-27
84TYPO

“… that is passed in when the notification sends the notification.”

too many notifications!

SteveJ

2009-05-27
84TYPO

“… that is passed in when the notification sends the notification.”

too many notifications!
Can you say it some other way?

SteveJ

2009-05-27
228OK

At the bottom of the page your code starts as:

-(IBAction) getValue:(id) sender{

Scott Stevenson read this line of code and with a frozen face said that
good coding conventions would require that the prefix “get”
not be used in this IBAction name.

Since I hold Scott in great regard,
I thought that I’d pass his message on to you, too.

Smile.

SteveJ

2009-05-29I agree in general that the accessor for foo should be foo and not getFoo. But this is not an accessor. I will look for a better name though for a future beta -- I too hold Scott in great regard.
230TYPO

The code at the bottom of this page should be for MyBookshelf.h
header file which contains outlets for each of the textfields as follows:

#import <Cocoa/Cocoa.h>
@class PragBook;

@interface MyBookshelf : NSObject {
IBOutlet NSTextField *authorField;
IBOutlet NSTextField *titleField;
PragBook *myBook;
}

@end

It should NOT be the code for PragBook.h header file
which is incorrectly shown on the page.

SteveJ

2009-05-28
192OK

At the bottom of the page it says:
Instead, hold down the shift and control keys and click on the table.
It should be:
…the shift, control and command keys and click on the table.

(I’m using Xcode / IB 3.1.2 on a Macbook Pro)

2009-05-29
193OK

12.2 Exercise … If you follow the steps prior to the exercise, there is no error when you “Build & Go”. (Xcode 3.1.2) Is there a parameter in IB that needs to be set, or un-set, to get the error to appear?

2009-05-29I just refollowed the instructions and got the same error. Are you sure you've connected the delegate and data source?
23ERROR

The path for creating a new Cocoa Application is “Mac OS X > Application > Cocoa Application”

You have the second path element written as “Applications” (Plural)

2009-05-27
198TYPO

“So select the first column in Interface Builder and use the Identity inspector” is wrong, should be “use the Attributes inspector” instead (as per diagram on following page).

2009-05-28
202SUGGEST

Instead of “Go back to the code as it was in Section 12.6” (and similar suggestions in earlier chapters where you show 2 ways of approaching a problem), perhaps introducing the Xcode snapshot functionality would be useful. It might be a lot easier than a big undo/re-edit cycle (just revert to an earlier snapshot).

2009-07-23Nice suggestion -- I'll incorporate this into the rewrite.
117TYPO

The last sentence of the second paragraph of section 8.1 should probably read “…it stores it in a third object…” instead of “…it stores it a third object…”.

2009-05-28
207TYPO

Sample code for HelloAppTableViewController.h is referenced in text, but (unchanged) code for HelloApplicationDelegate.h is shown.

2009-05-28
131TYPO

In the third paragraph, “NSWorkSpace” should have the second “s” lowercased: “NSWorkspace”.

2009-05-28
18TYPO

In footnote #4, the first two sentences have incorrect spelling of the word “its”. The usage denotes ownership, yet the spelling is the contraction of “it is”. Those lines should read: “One of the great selling points for Java was also its weakness. Its syntax was familiar.”

2009-05-27
172OK

Please include the source code for ActivityViewController.h(m) . It’s only a few lines extra. Plus it will benefit those of use who are reading this box on an airplane who don’t have interwebs to download the source from!

2009-05-29
222TYPO

Header file for Persistence/HelloAppTable18/HelloApplicationDelegate.h is shown (repeated from page 221-222), instead of Persistence/HelloAppTable18/PrefController.h (the details of which is referenced in the page text).

2009-05-28
221TYPO

After “We’ll need to create a subclass of NSWindowController that will act as the preference window controller.” - suggest adding some clarification text for the reader to create a the new class files and name them “PrefController” (otherwise you don’t mention creation of this class anywhere in the section).

2009-07-23
223TYPO

second last bullet point - " existing c nlasses" should be “existing classes”

2009-05-28
226TYPO

Second paragraph - “When we got to the (as yet) unwritten chp.Tables everything changed” should refer to Chapter 12.

2009-05-28
228SUGGEST

This is your first use of “@class” in a header file - without any explanation. As a result the implementation class of “MyBookshelf.m” needs to #import “PragBook.h” (not mentioned in the text). Is there a reason for this forward declaration vs. #import approach?

2009-07-23Thank you -- that is being addressed in the Snow Leopard rewrite and will come much earlier in the book.
228OK

No mention of need for dealloc method to free myBook that was allocated in awakeFromNib (present in sampled code though)

2009-05-29
236OK

Including the changes required in MyBookshelf.m to awakeFromNib (displayValuesIn is currently only shown) would be helpful here. Changes in the sample code are:

-(void)awakeFromNib {
myBook = [[PragBook alloc] init];
NSArray *fieldsToFill = [[NSArray alloc] initWithObjects:
authorField, titleField, nil];
[self setChapterName:@“Evaluate Your Projects”
pageCount: [[NSNumber alloc] initWithInt:14]];
[self displayValuesIn: (NSArray *)fieldsToFill];
}

2009-05-29I'm torn here. I include it in the sample code and don't want this to get in the way of the actual concept I'm teaching. If it continues to be a problem for you, please email me (daniel ) at (prag prog)
237SUGGEST

Perhaps reminding the reader to use the “Attribute Inspector” would be handy when setting identifiers for - “The first column has the identifier chapterTitle and the second column has the identifier pageCount.”.

I just had a period of complete bafflement due to setting values due to incorrectly using the “Identity Inspector” (stack trace hilarity ensued).

2009-05-28
267TYPO

last sentence -
" you will need to us NSLog( ) to display the result."
should be -
" you will need to use NSLog( ) to display the result."

2009-05-28
24SUGGEST

3. The name “nib” comes from the acronym for NeXT Interface Builder. Interface Builder and the framework that has become Cocoa was developed at NeXT Computer.

would be improved by “Cocoa were originally developed at NeXT”

2009-05-27
24TYPO

3. The name “nib” comes from the acronym for NeXT Interface Builder. Interface Builder and the framework that has become Cocoa was developed at NeXT Computer.

“was” should be “were” as you are referring to both Interface Builder and Cocoa’s predecessor .

2009-05-27
181TYPO

Last sentence of the third paragraph, “A category is like a mixin in other languages?” should probably end in a period, not a question mark - unless this is what the frightened programmer is thinking, in which case there should be quotes around it :)

2009-05-28
186TYPO

In the first sentence of the first full paragraph on the page, there should be a period after the word “extension”.

2009-05-28
39SUGGEST

The description of the process of building SimpleBrowser omits changing the Window title to SimpleBrowser and changing NewApplication to SimpleBrowser. This is fairly intuitive but perhaps a note to the effect that it is either covered later or left to the reader’s intuition is called for.

2009-07-23
40OK

The superscript 1 for note 1 is missing from the text:

When the user presses the
“Back” button essentially this message is sent:
[myWebView goBack]
The square brackets and everything in between make up the Message
expression. In this simplest of cases there are only two parts. The myWebView
object is the receiver.

2009-05-27It appears in the paragraph above.
263TYPO

In paragraph 3 after the heading “Number Formatters,” you find the following:

Look in your Interface Builder Library for am NSNumberFormatter.

‘am’ should be ‘an’

2009-05-28
211TYPO

last paragraph, first sentence should read either:
“… and a file in which we’ll store the array.” (change “where” to “which”)
or
“… and a file where we’ll store the array.” (omit “in”)

2009-05-28
216TYPO

Last sentence, last paragraph is missing the word “should”.
“You should be able to store and retrieve…”

2009-05-28
137SUGGEST

I couldn’t find the hierarchy in Document window depicted by the image on this page.

I did some research and found out that to see this, you have to switch the View Mode of the Document window to Outline mode. Might be worth mentioning?

Great book by the way! I just started using Xcode and Obj-C after doing Python on a PC for a while and I love it!
I bought Cocoa Programming for Mac by Aaron Hillegass, but never got into it.. This is a way better book for starters :)

Looking forward to the final release (and hardcopy;) !

2009-05-28
170SUGGEST

It would be great to be able to download the completed xcode projects. This way one could compare their own project to how it should be.
I, for one, can’t get the multi-nib Hello, Application project to work.. Keep getting an error stating: “-[NSViewController loadView] loaded the ”CurrentInfoView" nib but no view was set."

2009-05-28
267TYPO

The first sentence of the first paragraph of section 16.7 should contain the word “take” not “takes”.

2009-05-28
272TYPO

The second bullet point in section 16.11, the word “contains” should be “MyBookshelf”. I think.

2009-05-28
274SUGGEST

The last paragraph of section 16.11 that deals with conditionally enabling the remove button should be more specific about which Button Binding section the binding should be set under: Availability > Enabled, I assume. Perhaps another screenshot would be nice. I put it under Action Invocation > Argument the first time because I’m a noob.

2009-05-28
20OK

In section 1.4 you say to hold the option key down — on my computer, it’s the control key.

2009-05-29I've added something here but I think you were confusing two different ideas presented in this paragraph.
163ERROR

It would be helpful to describe what’s going on when you put in the line of code:

borderedIconView = (BorderedIconView *)[self view];

I assume we’re casting the current [self view] as a BorderedIconView before assignment, but for those of us who don’t really know for sure (myself included), some clarification would be helpful to understand and not just take it on faith.

2009-05-28
282TYPO

In the 5th paragraph, “Command Key arrangedObjects” should be “Controller Key arrangedObjects”.

2009-07-23
99OK

I have been unable to produce a red triangle. I have set garbage collection to unsupported as shown on the previous page.

2009-07-24
295TYPO

In the last paragraph, “sortDescriptor property” should be “sortDescriptors property” - plural.

2009-07-23
250ERROR

Counter5 example works fine if compiled for unsupported GC nevertheless does not work for supported GC. I assume that KVO in general should work well with supported GC but this is not the case with relevant code examples in this book. I believe that this situation asks for clarification, explanation and probably a KVO code that works with garbage collection.

2009-07-23
297TYPO

The code sample at the bottom of the page should be PragBook.m, not PragBook.h again.

2009-07-23
59TYPO

Second paragraph under “Joe Asks…”, first sentence. The word “let’s” should not have an apostrophe. Should read: “A warning lets you know…”

2009-07-23
296SUGGEST

You should probably mention that the Class of the PragBook Model Entity needs to be changed to the new “PragBook” class instead of the default “NSManaged”.
It took me a while to discover why my class wasn’t being called without this change (only worked it out via the source code).

2009-07-23
135SUGGEST

First: Great Book. Now: Chpt 9 (Custom Views). In this chapter you walk the reader through creating a custom view. I think it might help the book to take a paragraph or so to explain WHY A CUSTOM VIEW IS USED in more detail. In general, it might help readers to better understand the circumstances when a coder might want to consider a custom view approach (Chpt 9) over another approach (i.e., that used in Chpt 8). Pros/Cons of the Chpt 8 approach vs. the Chpt 9 Custom Views approach might help new programers understand which approach to use when planning their own applications. Just a paragraph or two at the very start of the Chpt 9 would be helpful.

2009-07-23Great idea -- I'm going to incorporate this (and expand on this chapter) in the Snow Leopard rewrite.
46ERROR

The signature of goBack: as described in the docs (XCode 3.1.3) is

- (void)goBack:(id)sender
not:
- (IBAction)goBack:(id)sender

2009-07-23
48ERROR

The signature of takeStringURLFrom:as described in the docs (XCode 3.1.3) is

- (void)takeStringURLFrom:(id)sender
not:
- (IBAction)takeStringURLFrom:(id)sender

2009-07-23
57OK

4.4 Actions and Outlets
Because you already mentioned MVC, in the drawing I would put the button and the text field in the context of a view.

2009-07-24
111SUGGEST

“Of course, now we’re responsible for releasing this memory
when we’re done with it.” I couldn’t find a follow up on this.

2009-07-23
159SUGGEST

“If you look at MainMenu.xib you’ll see that the “File’s Owner” is also given as NSApplication.".
The reader is in the Info.plist and might not notice that you mean you have to switch to Interface Builder and check the class indentity of File’s Owner there.

2009-07-23
36TYPO

The second sentence in the “Joe asks…” box is a run-on. It starts, “.In the top left corner of your Xcode window and you will see the warning…”

2009-07-23
214ERROR

Reading a plist - the presented code reads:
[self createNotifications];
where we are still using:
[self setUpNotification:……

2009-07-23
34SUGGEST

a stop button ? what stop button

2009-07-23
222ERROR

Code at the bottom mentions:
BOOL shouldLoadSavedRemovedApps;
but is not marked as a needed change. Since it is not used, it should be removed.

2009-07-23
234ERROR

The code will yield an error on the undeclared ivar bookInfo. As shown, it must be declared in the header file.

2009-07-23
237SUGGEST

Changes in the awakeFromNib are missing. You would have to consult the supplied source code to see the changes. It should be mentioned to remove the convertDictionaryToProperties, convertPropertiesToDictionary and createATempBookFrom methods.

2009-07-23
239SUGGEST

KVC/Bookshelf7 in the code download:
The forward reference @class Chapter in PragBook.h can be removed.

2009-07-23
237OK

The code mentions -(IBAction) setChapterName:
This should be -(void) setChapterName:

2009-07-24I may have to say this again but it is covered earlier in the book. Thanks.
256SUGGEST

Needed changes in Display.h are missing. Both observerOne and observerTwo need to be added as ivars. And released in dealloc.

2009-07-23
78TYPO

Duplicate ‘to’ at top of this page. “Once you have this window you ask it to to set its title” should be “Once you have this window you ask it to set its title”.

2009-07-23
175OK

The code at the end of chapter 10 does not link because it misses files ActivityViewController, which is only described in the following chapter as ‘and now remove ActivityViewController…’. This makes it very difficult to understand the point made in chapter 10.

2009-07-24Please see page 173 of the version you are talking about.
175OK

Missing source files in chapter 10

2009-07-24See page 173 and sample code.
203ERROR

Chapter 12.8: " The only other change that is required is to drop the
colon from the end of the column identifiers in Inter face Builder. They
should now be “appName” and “appIcon”. Build & Go and you should
see something like this." is clearly wrong … I’m getting tired of reporting mistakes in an edition that has visibly not been proofred.

2009-07-23Actually the text is correct. The column identifier is not the text that appears in the heading of the column. It is the identifier that we set in Interface Builder a few pages back.
259TYPO

Second paragraph, missing double quote after “most of it.” The exact line is

with KVO and KVC compliant classes, the answer is “most of it. Much of

2009-07-23
108OK

First: Thanks for a wonderful book !

I select the code in my Main.m file, choose Edit, but the Refactor… menu-item is disabeled (off). Any suggestions ?

2009-07-24Sorry I'm not seeing it -- please email me daniel at prag prog
147OK

When I run Hello Application, if I launch or terminate one application I get something that looks like the book. If I launch or terminate two applications consecutively then I get a red or green box around the icon. (well three sides of the box, the right side is left blank).

2009-07-24Sorry Joseph, I'm unable to reproduce your issue.
60OK

This is for p.60 of B1.07, May 29, Section 4.5, dealing with the missing import of <WebKit/WebView.h>. Wow, I say, the error message did not AT ALL indicate that that was the problem, to me at least. I’m used to Java coding in NetBeans and Eclipse where you get editor hints that say something like “add import for x.y.z”. I’m guessing that Xcode has no such feature (would be a lot harder in C than Java), but it would help my understanding a lot if you could explain better how to interpret such error messages.

2009-07-23Thanks -- I'm not really sure what to do about this. I'm showing you how to deal with an obscure, badly worded error message. There's really not much to interpret.
19OK

No closing quote marks:

“that Smalltalk is not only NOT its syntax or the class
library, it is not even about classes. I’m sorry that I long ago coined the
term objects for this topic because it gets many people to focus on the
lesser idea.

2009-07-24The quote continues so the quote is closed in the next paragraph.
282TYPO

Last paragraph before section 17.4, arrangedObjects is spelled arramgedObjects.

2009-07-23
12OK

A valuable addition to the book would be a short section covering unit testing under Xcode. It would be the “pragmatic” thing to do.

2009-10-14I've really struggled with this. When I coded in Java I was religious about test first - in Cocoa I'm still not happy with the available tools. I don't like the rhythm of OCUnit. I'm looking at a new framework available on google code but I've also avoided using third party libraries in this book. I'm not happy not including this but am not sure how I would include it.
140TYPO

First paragraph after first code listing. Second sentence:
We’ll use the setObject: for Key method to add a new entry…
should be setObject:forKey:

2009-09-23
283OK

The Family Of NSControllers list all the controllers that are available in Interface Builder. I noticed that description of NSObjectController, NSUserDefaultsController and NSDictionaryController are cut off. I presume this is because of screenshot?

2009-10-14
283TYPO

Last paragraph of chapter 17.6:

“Set the value of the Controller key is selection and the Model Key Path
should be count.4” This sentence is gramatically incorrect. Should be “The value of the Controller key should be selection…” or “Set the value of the Controller key to selection…”

2009-09-23
216OK

The footnote is staggered across 2 pages making it difficult to follow.

2009-09-24That gets fixed at layout—Dave
6969ERROR

In the second paragraph of page 69, the book currently says:

“… it knows how to respond to the message setShowsToolbarButton:. If our window has a toolbar then passing in YES displays the toolbar and passing in NO hides the toolbar.”

…which is not literally correct.

What that message actually does is specify whether or not the window shows the toolbar control BUTTON (right side of the title bar), not the visibility of the toolbar itself.
(I wish I could bold/italicize, rather than yelling in all caps).

Liking the book so far!

Ken H

2009-09-23
86TYPO

subview not well written in:
“So when you want to add a view
to a window as its >> subivew <<< you ask the view controller for the view it
controls”

2009-09-23
86TYPO

“when you want to add a view to a window as its subivew you ask the view”
“subivew” should be “subview”

2009-09-23
88OK

Perhaps display the desktop version and the iPhone version side by side?

2009-10-14
135ERROR

Isn’t it NSWorkspace instead of NSWorkSpace? “We go right to the source. NSWorkSpace manages the application environment on our desktop,”

2009-09-23
29SUGGEST

I am going through the SimpleBrowser example and I am at the end of chapter 2.3. It says:

Select the Window and in the Size Inspector you’ll see a section labeled “Window Size”. Check the “Has Minimum Size” checkbox and click on the “Use Current” button.

I’ve selected the Window(where I put the text field and buttons) and I am in the Size Inspector and there’s no “Use Current” button.

It took me some time to realise that I have to select the Window (Window) in the MainMenu.xib window and not the window where I put all components.

2009-09-23
14TYPO

“hook them up to controller’s” (in first paragraph of Beta 1.07 notes) should not have an apostrophe.

2009-10-17
15TYPO

Missing word “of” between “way” and “user” in the sentence fragment “Although Apple has said that there will be very little in the way user visible changes…”

2009-10-17
74TYPO

“But sometimes you do want other objects you be able to examine and possibly”

should be “other objects TO be able”

2009-10-17
36TYPO

“you can right-click (or ^-click) on the web view do bring up a heads up display version”
should read
“you can right-click (or ^-click) on the web view to bring up a heads up display version”

2009-10-17
50TYPO

First paragraph after heading “3.3 Methods with Arguments”:
“You should see to methods” should read “You should see two methods”

2009-10-17
59TYPO

Footnote at bottom of page 59 - the word “refer’s” should be “refers”

2009-10-17
64SUGGEST

Page 64 “Greeter:NSObject indicates that the SimpleBrowserController class directly extends the root class NSObject” - this paragraph does not make a lot of sense especially in the context of the HelloWorld app.

2009-10-19
74TYPO

“Often that state is internal you your object” should be “Often that state is internal to your object”.

2009-10-17
74TYPO

“In the last chapter we set certain attributes such as a the font size” should not have “a” before “the font size”.

2009-10-17
83TYPO

8.6 - “Once set of attributes” should read “One set of attributes” (?).

2009-10-17
84TYPO

At the bottom of the page, the paragraph talks about the setter of a property named time of type NSDate, however the code segment says setname:newName etc.
I think the code section should be setTime:newTime etc?

2009-10-19
23TYPO

“The examples in this book assume you are running at least Xcode 3.1.”

You need Xcode 3.2 to be able to follow the chapters where AppDelegates are used.

2009-10-17
181OK

Continuity problem.
At the bottom of 181, “One thing you haven’t done yet” - I believe that was done in chapter 4. Also it says “touch on memory management etc”, which was also done previously. The next chapter does something else.

182 - The first sentence of the chapter “That was a pretty boring HelloWorld” is a non-sequitur after the previous chapter of complicated SimpleBrowser notifications. Also the following paragraph talking about garbage collections is irrelevant at this point, as it happened so far back in the book.

2009-10-14Thank you Caroline - \n \nThat's why I left the revision marker in to indicate that I had only revised the book up through Chapter 10. I decided this material needed to be presented earlier and will remove it from Chapter 11 which is completely changed for the next beta. \n \nD
86ERROR

You wrote:

“The today is an NSDate. It is a pointer to an object that doesn’t conform to NSCopying and so we use retain as the memory attribute.”

Looking at the NSDate Class Reference, it says NSDate DOES conform to NSCopying.

2009-10-19
168OK

Page 168 - 10.10 Organizing with pragma marks and page 191 - 13.5 Introducing pragmas cover the same information.

2009-10-14Thank you. You are, of course, right. I haven't revised 13.5 yet to remove that material but felt it appropriate to introduce it earlier.
64TYPO

I believe that “SimpleBrowserController” should be replaced with “HelloWorldAppDelegate” in the sentence "Greeter:NSObject indicates that the SimpleBrowserController class directly extends the root class NSObject.

2009-10-19
148TYPO

Accidentally submitted this for page 147, but should be 148:

“Drag to connect frameLoadDelegate to your SimpleBrowserController.” SimpleBrowserController has been called BrowserController up until now.

2009-10-19
ManyERROR

In the sections that have been updated for Snow Leopard & Xcode 3.2, you are constantly referring to ‘Build and Go’ but it’s called ‘Build and Run’ in this version of Xcode.

2009-10-14
162ERROR

“As a final tweak, change the Return Key from “Default” to “Go”. Save your work and run the application again. Now the keyboard looks like this."

But the image included has the Return Key text set as “Return” instead of “Go”.

2009-10-19
168SUGGEST

#pragma mark -

It might be worth pointing out that if you have an extra trailing space at the end of the line, it doesn’t render as a dividing line in method drop-down list

2009-10-14
22TYPO

The url for Apple Developer Connection doesn’t work.

2009-10-17
78TYPO

And in the initWithName: method we call the getter like this.

“getter” should be “setter”

2009-10-19
68TYPO

Is this really how your create the greeter object? I thought you would need an alloc and and init…
Below is what you put int the code on p. 68
>>Greeter *greeter = [self greeter];
Not sure (I’m learning), but, thought I would send you the FYI.

2009-10-19Thanks - in an earlier version I did it with alloc, init. I'm still doing it that way but I've moved the alloc init inside of the greeter method.
27ERROR

The “Build & Go” button is now labelled “Build and Run” in Xcode 3.2 (xCode IDE: 1610.0).

2009-10-14
28ERROR

“The one you care about is empty except for the word “Window” in the title bar" should read “The one you care about is empty except for the words “Simple-Browser” in the title bar". Seems that Xcode 3.2 gives the window the title of the project.

2009-10-19
39ERROR

Existing line at bottom of PDF page 39 “Right-click or C-click on the Frameworks folder and choose SimpleBrowser > Add > Existing Frameworks …” should read “Right-click or C-click on the Frameworks folder and choose Add > Existing Frameworks …”

2009-10-19
277SUGGEST

in the - (void)setSupportFile function you use:

[fileManager createDirectoryAtPath: supportFolder attributes: nil]

to create the Application Support directory for “Hello Application Table”. In the XCode documentation it says this method is deprecated as of 10.5. When running through this example I used:

[fileManager createDirectoryAtPath:supportFolder withIntermediateDirectories:NO attributes:nil error:NULL];

2009-10-19
46TYPO

Section 3.2: Help > Documentation is now Help > Developer Documentation

2009-10-19
81TYPO

Top of page: “That changes the initWithName: method to this” - but the code snippet shown is the sayHello method, not the initWithName: method.

2009-10-19
91TYPO

in section 6.2 The Clang Static Analyzer:

‘Choose the menu item Project > Edit Project Settings and in the “Build” filter for the garbage collection setting and set it to “Unsupported” ’

Should lose the second “and”

2009-10-19
96TYPO

top of page: ‘[the leak] is reported to originate in Greeter’s applicationDidFinishLaunching: method’

The applicationDidFinishLaunching: method is in FlashlightAppDelegate, not Greeter

2009-10-19
97TYPO

oops - #41016 above refers to PDF page 97, not 96

2009-10-19
100OK

Section 6.9, second paragraph:

‘Note that in the init method we let the super class do its initialization before we did our custom initialization. Here we clean our custom objects up first and end with a call to [super dealloc].’

Maybe I’m missing something, but in the sample code you provided for the init method (in the Greeter.m download link in the PDF), there is no call to [super init]. All there is is custom initialization.

2009-10-19init turns around and calls initWithName which is an "init" method which behaves exactly as described
131TYPO

Section 8.7 second sentence:

‘rowserController’ should be ‘BrowserController’

2009-10-21
29ERROR

I don’t have a MainMenu.xib at all — only a MainMenu.nib. So I cannot check the XML behind the interface we are building. This is XCode 3.2 on Snow Leopard…

2009-10-29
26TYPO

“One of the keys to the section section is modularity.”

Note “section” is said twice. Should be “third section”, or possibly just “section”?

2009-10-29
44TYPO

Possible typo. You say:

“You will work Xcode to define your classes and you will instantiate classes into objects in either Xcode or Interface Builder.”

Do you mean “You will work in Xcode…”?

2009-10-29
59ERROR

I don’t get this. Now I tried downloading XCode 3.2.1 and also the IPhone development SDK (3.2.1). I’m using SnowLeopard, and the screenshots for creating a new application do not look like those in the book. I also still have no xib-file, only a nib-file.

Below classes I do not get the HelloWorldAppDelegate.m file. So I cannot follow the example at all.

Perhaps you must be more specific of which version of XCode you are using, or at least specify how we get these extra files somehow…

2009-10-29
175TYPO

“In ActivityController.m you need to synthesize currentApp and create an instance of the RunningApplications in awakeFromNib. Be sure to import RunningApplications.h.”

References to RunningApplications and RunningApplications.h are left over from previous beta? This is the first time it’s been mentioned in the current PDF, and doesn’t seem to be related to what’s being discussed.

2009-10-29
111TYPO

First paragraph, last sentence, has an extraneous “that”: You’ve already seen that how to create the view using Interface Builder.

2009-10-29
59SUGGEST

Finally got it. A suggestion to help people in the same situation as I was: First hint something is very wrong is that the icons for the templates are all shaped like little blue prints. You will not get xib-files, and there are no AppDelegates generated.

Seems to be a problem since I installed XCode from Leopard, upgraded to Snow Leopard and installed the new tools. Even downloaded the latest tools and nothing helped.

Solution: Uninstall the tools using the commandline and delete the Developer-folder entirely. Restart machine. Install the latest tools. Restart again (perhaps not needed). After this everything works as described in the book.

2009-10-29
98SUGGEST

Just a note that if you are running this on a real device Build and Analyze doesn’t yield the same results as the Mac. In fact it doesn’t complain at all about host. The Leak analyzer also doesn’t work with a real iPhone either.

2009-10-29
206TYPO

CustomApp should be CurrentApp (two places).

2009-10-29
89TYPO

At the first paragraph(“You can also use separate synthesize directives for each property if you prefer.") you are saying "synthesize today;” which should be “@synthesize buddy;”

2009-10-29
97TYPO

This one is related to #41102:
You use “NSDate *today;” here and back at exercise 5.7 “Greeter *buddy”. I think the exercise is bugged.

2009-10-29Actually it's fine here -- I'm now using copy as the memory attribute. I also call it out because I use it to generate a time stamp.
110SUGGEST

The second last paragraph(“If you look at the final version in the code …”) on this page can be removed because XCode 3.2.1 adds the dealloc method automatically to FlashlightAppDelegate.

2009-10-29
112TYPO

“Just like a wall socket, the outlet is a place in the controller where the visual element plugs in to.”
“in to” should into

2009-10-29
187TYPO

the method call is listed as [self.apps.delegate sayHi]; but it should be [self.currentApp.delegate sayHi] so the whole awakeFromNib method should be:

- (void)awakeFromNib {
\tself.currentApp = [[CurrentApp alloc] init];
\tself.currentApp.delegate = self;
\t[self.currentApp.delegate sayHi];
}

2009-10-29
156OK

In final listing 9.13 the following lines are not needed due to the default behavior of NSProgressIndicator *progress:
[self.progress setHidden:YES];
[self.progress setHidden:NO];

2009-11-11Actually you can check by commenting them out that they are needed.
168SUGGEST

To be consistent shouldn’t:
interface MobileBrowserViewController : UIViewController <UITextFieldDelegate> { be: interface MobileBrowserViewController : UIViewController <UITextFieldDelegate, UIWebViewDelegate> {
?

2009-11-11You don't lose anything by doing it your way -- you don't have to declare informal protocols and so I'm not.
37TYPO

First sentence of the last paragraph has an extraneous “the” in front of “either” at the end of the first line.

2009-11-11
38TYPO

At the beginning of the first new sentence on line one, shouldn’t “This” be “The” instead?

2009-11-11
227TYPO

“ImageView” should be changed to “IconView” within the first sentence on the last paragraph on the page:

Add a property named alertColor of type NSColor to your ImageView.

should be

Add a property named alertColor of type NSColor to your IconView.

2009-11-11
244TYPO

Need to replace “if” with “it” in the following sentence: We don’t want to have to use if every time we fill a table cell.

2009-11-11It should be "if" as in an "if" statement I've clarified
345TYPO

“Connect the and bind the visual elements to the Author Controller”

Should be “Connect and bind the visual…”?

2009-11-24
346TYPO

“Ender the chapter numbers and titles for a book.”

Should be “Enter the…”

2009-11-24
74OK

The implementation of initWithName: uses the method variable "newName", while the interface declares the method variable “name”.

More detail is below:

Within the Greeter interface the following method is defined:
-(id) initWithName:(NSString *)name;

The method variable “name” conflicts with the Greeter’s member variable “name”.

On the next page, the initWithName: implementation corrects the typo:
-(id) initWithName:(NSString *) newName {

}

2009-11-24I can see why this might be confusing, but this is not a typo. There would be no harm in making the change you ask for, but it is correct as it stands.
82TYPO

“There wasn’t anything special about they way in which we implemen- tated the getter and setter methods.”

Should be:
“…about the way…”

2009-11-24
187TYPO

[self.apps.delegate sayHi]; apps hasn’t been declared, i think it’s currentApp

2009-11-24
26TYPO

One of the keys to the section section is modularity. We break methods,

i guess the section section part is a typo

2009-11-19
63SUGGEST

Hint: When selecting the text to Refactor make sure you don’t include either of the curly braces. If you do, you won’t have the ‘Extract’ option available in the drop-down menu.

2009-11-24
63ERROR

Reference is made to labelFrame, but the code says labelLocation.
It is renamed labelFrame on the following page.

2009-12-18
314ERROR

The code examples seem to be missing new code, i.e., there’s no mention of ‘totalCount,’ neither any new methods (though it is possible to guess all that’s missing, for example: “NSNumber *countOne, *countTwo”; should be“NSNumber *countOne, *countTwo, totalCount”).

2009-12-18
84ERROR

Top of page - “That changes the sayHello method to this.” - should be - “That changes the initWithName method to this.” (followed by the updated initWithName implementation) since we are now talking about the setter.

2009-12-18
80OK

Under the Greeter.h code, the declaration of the setName: method takes a parameter called ‘name’, but in the implementation of setName on the next page, you called the parameter ‘newName’ instead of ‘name’. I didn’t test it your way, but I assume they need to match.

2009-12-18They don't -- but thank you.
63SUGGEST

Even though you called section 4.3 ‘Refactoring Code’, it is a departure into a discussion about xCode that is somehow not immediately obvious. Perhaps you could shorten the section, and make it a ‘Joe Asks…’ section on how to quickly rename variables.

Personally, as soon as you wrote “Let’s change the variable name from labelLocation to labelFrame”, I went ahead and did it, so it took me a second to figure out why you were still talking about labelLocation after that.

2009-12-18
87OK

Third paragraph reads “You want to use assign for all non- object types”. Perhaps you could explain why ‘assign’ appears to be used for an object pointer in ‘HelloWorldAppDelegate.h’.

@property (assign) IBOutlet NSWindow *window;

2009-12-18I don't know where to do that. Your question is a good one but it doesn't fit here. They're really avoiding a corner case of circular dependencies. Your example doesn't counter what I'm saying here so the explanation needs to go elsewhere - not sure where.
89ERROR

Last sentence of last paragraph reads “Note that we’ve also initialized the name and upperCase variables in initWithName:.”

If by that you are referring to the change to dot syntax, then the ‘name’ variable was already changed in code at the top of pdf page 84 (except that the code example on the top of page 84 is the wrong one as noted in my erratum for page 84).

2009-12-18
102ERROR

Top of page reads “Choose the menu item Build > Build & Debug. You should see a boilerplate message in your Console window followed by something like this.”

Strangely, I only get the error message once in a while. It is inconsistent as to when it appears. If I switch from ‘Build & Debug’ to ‘Run’ or ‘Build & Run’, I might get the error. The only time it is consistent is when I build after cleaning the project.

This is what I get when the error doesn’t appear…

2009-11-30 08:04:03.984 Flashlight[2695:207] Greeter, name: Maggie
created: 2009-11-30 08:04:03 –0600
2009-11-30 08:04:03.984 Flashlight[2695:207] Greeter, Greeter,

2009-12-18
105ERROR

Last paragraph says “On the other hand you don’t need the object that myGreeter points to any more so you release it.”

The ‘myGreeter’ variable is shown as simply ‘greeter’ in the code example above.

2009-12-18
105OK

In the ‘setGreeter’ code example, the question that comes to my mind is, why isn’t ‘newGreeter’ released after the object it points to is retained by ‘greeter’?

This would seem like a memory leak… or is there a special case where method arguments don’t need to be released manually?

Perhaps this could be explained.

2009-12-18I don't know if you'll see this but ... \n \nnewGreeter points to some memory \n \ngreeter points to some memory \n \nyou hold onto the location that newGreeter points to \n \nyou let go of the location that greeter points to \n \nyou then redirect greeter to point to the location that newGreeter points to. At the end of this method newGreeter is gone but what it pointed to is now held by greeter.
112OK

Code example at top of page -

Greeter *host = [Greeter greeterWithName:@“Maggie”];

This line had earlier in the chapter been converted to -

Greeter *host = [self greeterFor:@“Maggie”];

So the proper place for -

[Greeter greeterWithName:@“Maggie”]

would be in the greeterFor: method.

2009-12-18Your way is a valid alternative. I'll stick with this way.
128TYPO

Last paragraph, first sentence, change ‘out’ to ‘how’.

Currently reads:

“…on page 113 you learned out to…”

Should read:

“…on page 113 you learned how to…”

2009-12-18
130TYPO

Fourth (last) paragraph starts with an nonsensical sentence:

“Interface Builder provides us with a representation our BrowserController object in.”

2009-12-18
168OK

Perhaps a note (or a reminder if that be the case) on why we don’t need to declare in the header for ‘MobileBrowserViewController’ like we did with .

(Very good book so far.)

2009-12-18
167SUGGEST

This may be more than you intend for this section, but perhaps a note on why NSTextField knows how to trigger an action, while UITextField needs a delegate.

Is there some sort of ‘hidden’ delegate that is being utilized when configuring an NSTextField in IB?

2009-12-18
74TYPO

Now lets look at line 13 in the sayello method.
should read
Now lets look at line 6 in the sayHello method.
at start of paragraph 3

2009-12-18
179TYPO

Second paragraph, first sentence:

“The name method returns the name of the notification. and the object…”

Remove the period after the word ‘notification’.

2009-12-18
185TYPO

Section 11.10, first paragraph, first sentence reads:

“You know how to every step…”

Should be:

“You know how to do every step…”

(or something similar)

2009-12-18
191TYPO

First paragraph, first sentence, third word:

applicationdidLaunch:

The first d in ‘did’ isn’t capitalized.

applicationDidLaunch:

2009-12-18
196TYPO

First paragraph, first sentence, missing close quote after the word “Terminated”.

2009-12-18
199SUGGEST

Perhaps I’m getting ahead of things, but since the section at the bottom half of page 199 is about Reducing Redundancy, then why did we route the ‘respondToChange’ method through the ‘applicationDidLaunch’ and ‘applicationDidTerminate’ methods instead of calling ‘respondToChange’ directly from ‘registerNotifications’?

Again maybe there’s a reason that is forthcoming. In the meantime, it would seem like a logical change.

2009-12-18
203ERROR

First code line at top of page:

[activeApps removeObjectForKey: appName];

Should be:

[runningApps removeObject…]

2009-12-18
205TYPO

Second to last paragraph:

NSAPplication

should be:

NSApplication

2009-12-18
217ERROR

Last Paragraph, you refer to an outlet called ‘iconView’.

Up until now, it has been called ‘imageView’.

2009-12-18
224OK

Perhaps you could clarify one thing. Earlier in the book, a statement was made that if it can be done in IB, then it should be (or something like that).

Is working with multiple NIBs an exception to that rule? Or did we work directly in code in the latter part of this chapter merely to demonstrate how it could be accomplished without IB?

In other words, which is the recommended way to set up our multiple views. In code, or in IB?

2009-12-18
212TYPO

Missing a space after the sentence: “We’ll put these components into one nib.”

2009-12-18
228ERROR

Last paragraph contains the sentence:

“The x-axis increases to the right and the y-axis increases to the left.”

If the coordinates are anchored from the bottom left corner, then wouldn’t the y-axis increase toward the top?

2009-12-18
228ERROR

Last sentence (which continues onto the next page):

“The frame, unless we specify otherwise, will straddle the line so really the bottom left corner of the black frame is at the point (12, 30).”

I’m trying to figure out precisely what you mean when you write that the frame straddles the line. In any case, since the width of the stroke is 12 on all sides of the rectangle, it would seem that the x and y coordinates of the bottom left corner of the stroke would be affected equally. The way you have it written, the x coordinate is reduced by 6 (from 18 to 12) and the y coordinate is reduced by 12 (from 42 to 30).

I assume this is an error. If not, please explain more clearly how the coordinate system works.

My guess is that the frame of the ‘stroke’ straddles the line, so that a stroke that has a width of 12 will be drawn in such a manner that half of its width is drawn toward the inside of the 180 x 180 rectangle, and the other half of its width is drawn toward the outside.

If this is correct, then the resulting coordinate of the lower left corner of the black frame would seem to be (12, 36) instead of (12, 30).

2009-12-18
227SUGGEST

Bottom of page - perhaps just a quick comment on how NSView’s drawRect: method is getting called.

Is it part of the initialization of any NSView object? Does it have something to do with the nib?

The documentation doesn’t explicitly state if it is part of the NSView initialization either. Perhaps a comment could go on page 229 before the Exercise. Or maybe it’s just beyond the scope of your intention.

2009-12-18
233OK

In section “15.6 Drawing Text”, which spans the next few pages, the code is out of sync with the explanation. It all works out if you skip ahead and go back, but the flow of the section is completely lost.

2009-12-18I'm not understanding your comment. I checked the flow and believe it is correct.
244OK

In the code at the very bottom of the page, your signature for the ‘initWithNibName:Bundle:’ method is:

- (id)initWithNibName:(NSString )nibName bundle:(NSBundle)nibBundle

In documentation, it is slightly different:

- (id)initWithNibName:(NSString )nibNameOrNil bundle:(NSBundle)nibBundleOrNil

It seems to work either way as long as the call to ‘super’ matches. In my case, I got the method name from documentation, but my call to ‘super’ came from your solution, so the code was broken at first.

I thought I’d point it out since you’ve stressed the importance of copying method signatures from documentation.

2009-12-18Thanks -- the name of the variables in the declaration of a signature doesn't matter as long as (as you observed) match how they are used in the method. I shortened the variable names so that they fit on one line in the book
249SUGGEST

Top of page, code examples for ‘applicationDidLaunch:’ and ‘applicationDidTerminate:’ -

This is minor, but the:

[table reload]

statement seems to be a departure from the now familiar use of ‘self’, as in:

[self.table reload]

2009-12-18
258TYPO

Section 17.5, middle of first paragraph, you wrote:

“For the most part you’ll want to the techniques…”

It should be something like:

“For the most part you’ll want to use the techniques…”

2009-12-18
265ERROR

The first two sentences on this page appear to be telling me to do the same thing from opposite perspectives and are therefore redundant. Or else I’m just missing the point.

“Use the Connections Inspector to connect its selector to the app delegate’s openPreferences: action.”

“Use the Connections inspector to connect the HelloApplicationDelegate’s openPreference: action to the Preferences… menu item.”

2009-12-18
268ERROR

Third to last paragraph, last sentence reads:

“In IB use the Connections Inspector to wire this outlet and action to the File’s Owner.”

The outlet and action are in PrefController, which is also the File’s owner, so they would be wired to themselves.

You must mean to wire them to Matrix instance in the preferences window.

2009-12-18
268TYPO

Second to last paragraph, first sentence:

“…so that we can figure out which one is selected and so can change the settings.”

The part after the word ‘and’ should probably read:

“…and can change…”

or:

“…and so we can change…”

or something like that.

2009-12-18
269SUGGEST

In the code example toward the end of the page, you should probably highlight (with an arrow) all four lines after the “NSDictionary *defaults =” line.

The reason is that the last time we worked with this “initialize” method, we used the “dictionaryWithObject: forKey:” method.

This new version uses “dictionaryWithObjectsAndKeys:”, so more than just the two currently highlighted lines need to change.

2009-12-18
273ERROR

I’m not actually implementing this section, merely reading it, but in the code example toward the bottom of the page, you create a “NSDictionary *” called “view”, but in the next line of code that starts with “self.ac =”, you seem to have changed the name of the NSDictionary to “viewDictionary”.

Again, I’m not implementing this, so I can’t test it, but it looks like “view” stores the NSDictionary, and the next line should pull values from that same NSDictionary named “view”, not “viewDictionary”.

2009-12-18
275ERROR

Hey, I haven’t been putting my name in these errata! What was I thinking???

Last paragraph, last two sentences:

“It has the method initWithNibName: but there’s nothing left to tell it what its nib name is. Add this implementation of init just below the initWithNibName: method.”

The two references to “initWithNibName:” should (I think) actually read “initWithWindowNibName:” since that is the method used in code up until now, and that is the method we now call from “init”.

2009-12-18
278OK

Last code example toward bottom of page is missing the opening curly bracket after the ‘else’ statement.

2009-12-18
125OK

Creating the generalize and personalize methods here without signatures in the .h file throws a warning

2009-12-18Not if you do it how I've shown. I'll bet you've introduced them below where they are called and so you're getting warnings.
278OK

For the longest time I couldn’t figure out why the code in this section didn’t work for me. All the previous code worked to this point.

Finally I realized that if I add (retain) to ‘app’ in the CurrentApp header file, it fixed the problem.

Looking at your downloadable code example for ‘HelloApplication45/CurrentApp.h’, you don’t have (retain) set for your ‘app’ variable. So now I’m confused. Does your code work, and I’m missing something else? Or is your code broken without (retain) like mine was?

My GarbageCollection is set to ‘unsupported’, if that makes a difference.

2009-12-18That is exactly the issue. I am requiring in this book that your Garbage Collection is set to required
128TYPO

In Chapter 7, Outlets and Actions, on page 113 you learned out (should be how) to con- nect code that you created with objects that were created in Interface

2009-12-18
282SUGGEST

Second paragraph, last part of last sentence:

“—we’ll skip that step for now since author is not a collection.”

For consistency, change ‘author’ to ‘title’ since that is the variable you used throughout the rest of the paragraph and in the short code example above.

2009-12-18
284ERROR

Third paragraph, second sentence:

“Next use the Connections Inspector to connect the infoField outlet…”

The ‘infoField’ outlet is actually called ‘valueField’ in the previous code and text.

2009-12-18
284TYPO

Second to last paragraph, second sentence:

‘type “author” instead and…’

First word of sentence (type) is not capitalized.

2009-12-18
286TYPO

Second paragraph, last word:

“displa” should be “display”

2009-12-18
286TYPO

Second paragraph under section 19.4:

“In this method you set which ever property’s name…”

It would be better form if “which ever” was the one word “whichever”.

2009-12-18
286SUGGEST

Section 19.4 Exercise, second paragraph:

“In this method you set which ever property’s name appears in the top text field to be the value that is entered in the bottom text field.”

This description of the exercise completely confused me for some reason. Perhaps partly because I was tired. Anyway, when I went ahead and did the exercise (the next morning) it made perfect sense. We are updating the value that corresponds to the key shown in the first field by modifying the value currently shown in the second field and hitting enter. So if the first field shows ‘author’, I then can update the value of the ‘author’ key by typing a new author’s name and hitting enter.

It all makes sense now, but when I go back and read that sentence, it still sort of confuses me. I think it sounded a little like you were saying that whichever property’s name appeared in the first field would literally become the value of the second field. So if I typed ‘author’ in the first field, then ‘author’ would appear in the second field.

Perhaps the description could say something like:

“In this method, you update the value of the key that is shown in the first field by typing a new value in the second field and hitting Enter.”

Just a thought.

2009-12-18
287TYPO

Code example toward bottom of page, when creating the NSDictionary, the book title you gave is “Manate Your Project Portfolio”.

“Manate” should be spelled “Manage”.

2009-12-18
299OK

Top of page, first code example:

The signature for the ‘updateDisplay:’ method in the header file doesn’t exactly match that in the implementation. The name of the received parameter is ‘newValue’ in the header, and simply ‘value’ in the implementation.

Code still works apparently.

2009-12-18There is no requirement that they match.
298SUGGEST

Bottom of page, last line of code:

“IBOutlet NSTextField *displayField;”

This seems to be the first time that we’ve used IBOutlet somewhere other than in a ‘@property’ declaration. Makes sense since the variable needs to be declared somewhere as an IBOutlet. Caught me off guard at first, though. Perhaps a small note on this fact.

Also, for clarity, I would personally tend to want to always use IBOutlet in my variable declarations even if it is redundantly asserted in the ‘@property’ line. Maybe a note on the ups and/or downs of this as well.

2009-12-18
301SUGGEST

Middle of page:

Paragraph start with: “Next connect the Display object…”

Sounds like you’re telling us to perform a step, rather than giving us an overview of what you’re about to show us.

Maybe say: “Next, we’re going to connect the Display object…”

2009-12-18
308ERROR

Code example for UpOrDown implementation, you seem to have unnecessarily imported “Display.h”. (Probably left over from when we were sending messages instead of observing.)

2009-12-18
308TYPO

The following sentence, toward bottom of page:

“Add a second outlet for the additional text field inDisplay.h.”

Missing a space between ‘in’ and ‘Display.h’

2009-12-18
311SUGGEST

My apologies if this is too nit-picky, but second paragraph, first sentence:

“Create an Observer class and add properties to hold the name of the target object and action.”

Is the Observer class technically holding the ‘name’ of the target object? When you have an variable of type ‘id’, what exactly is it holding? I assumed it was a pointer to an object (in this case, a reference back to the Display object).

2009-12-18
313SUGGEST

First paragraph, second sentence:

“Each instance of the Observer knows what its listening for and knows what needs to get done when it gets called.”

Sorry to be picky again, but this sentence has got me thinking. Do the observers really know what they are listening for? They seem to know what needs to get done when they’re called, but they seem oblivious as to what they are listening for or what even will cause them to be called. The ‘Display’ class seems to know because it registered the observers, and the ‘UpOrDown’ instance would seem to know because it received the observer and makes a call to the observer at the appropriate time, but the Observer instance themselves seem to be out of the loop until they’re called, at which point they perform their task.

2009-12-18
314TYPO

First paragraph under code examples:

There’s a sentence fragment at the end of the paragraph.

“and we just log the total to the console in”

2009-12-18
317TYPO

Sentence toward bottom of page:

‘As before, use the Attribute inspector so that the stepper’s behavior is set to “Value Wrap”.’

“Value Wrap” should be “Value Wraps”.

2009-12-18
321ERROR

Fourth paragraph, last sentence:

“So I restrict my values to integers but I can’t select any integer between zero and one hundred.”

I think you mean you can’t select any integer between zero and five. If not, then I’m just not sure what you’re getting at.

Also, in order to get multiples of five, I think you actually need to have 21 tick marks instead of 20. One to indicate zero, then 20 more for the twenty multiples of 5 from 5 to 100.

2009-12-18
328TYPO

Second to last paragraph, second sentence:

“This time you’ll bind the array controller we will bind the controller to the array using the content array.”

Sentence seems to start over mid-sentence.

2009-12-18
54ERROR

The “Java translation” of “[myWebView goBack:self]” should use “this” instead of “self” as parameter.

2009-12-18
347TYPO

First paragraph, third sentence:

“In our case, you are searching for book’s whose…”

The word ‘books’ should not have an apostrophe.

2009-12-18
351TYPO

First paragraph after last code example, first sentence:

“…may not respond to the methods writeToFile:automically:”

should end with “…writeToFile:atomically:”, not “automically”.

2009-12-18
352TYPO

First paragraph after “NSSet+Persistence.h” code example, last sentence:

“writeToFile:automically:” should be “writeToFile:atomically:”

2009-12-18
1SUGGEST

Great book! Only general comment I’d make would be that there’s a consistent lack of commas in sentences. I’m hoping you’ll also include advice on where to go from here.

Again, great book!

2009-12-18Thank you Patrick. In this next pass I hope to also add more references. Thanks for all of your helpful errata.
55SUGGEST

The footnote 5. about ‘YES’ and ‘NO’ more or less duplicates your comment at the end of section 3.2, which was well-stated.

2009-12-18
56SUGGEST

Your footnote 6. calling out the “Objective-C 2.0 Programming Language” document duplicates the information at the end of section 3.4, currently on the
same page. (Just trying to save you work, long-term.)

2009-12-18
64TYPO

In paragraph: “We could easily…”, command-click should/be ctrl-click.
In next paragraph, there s/b no space after (void) to match refactored code on next page.

2009-12-18
65TYPO

“Two quick notes” s/b “Three quick notes”.

2009-12-18
65SUGGEST

Combine bullet points 1 and 3; then there will be 2 quick notes.

2009-12-18
76OK

The method declaration styles are inconsistent in the book; this page is
a good (bad) example. Do you want a space after the ‘’ or not? Do you want a space after the ’)’ or not? The template for applicationDidFinishLaunching is actually mis-copied, because Apple puts a space after the ’’. If you are teaching style as part of an introductory book, you need to pick one.

2009-12-18I honestly don't care as they make no difference but I will settle on one and fix it in our next beta.
78TYPO

In the NSString* name vs. NSString *name lines, ‘prefered" s/b ’preferred’.
Great that you take the trouble to mention this issue, by the way.

2009-12-18
79OK

At the end of 5.1 you mention that ‘id’ is a pointer, and then mention the Apple ObjC doc for another reason. Is there a sneaky writery way to point off to p. 14 of that doc where the ‘id’ typedef is shown/described AND make your other point as well?

2009-12-18NOthing sneaky writery intended. I'm not sure what you're saying though.
371TYPO

In the first sentence, “We put the type for x in parenthesis.” the last word should read “parentheses”.

2010-02-06
374TYPO

In the code listing near the top of the page, in the line which reads

[temp addObject:[NSNumber numberWithInt:result]];

the variable ‘temp’ should read ‘tempArray’.

2010-02-10
232ERROR

Top of page:

“The stroke, unless we specify otherwise, will straddle the line so really the bottom left corner of the black frame is at the point (12, 30).”

Sorry to comment on this again, but still seems like the resulting coordinate should be (12, 36) instead of (12, 30).

My previous comment got a little long, so you may have just missed the last part of it… or I’m mistaken.

2010-02-05I suppose I should be particularly embarrassed because of what I have an advanced degree in ... math. Sigh - thank you.
237SUGGEST

My comment on the previous version of the book (page 233 of that version) suggested that the flow of section 15.6 ‘Drawing Text’ was lost.

I think where I was momentarily confused was at the last sentence of the page where it reads:

“The result should look like this.”

followed by a screenshot on the next page. At first I didn’t realize you meant that the result will look like that after another page or so.

After continuing on, it did indeed look like the screenshot.

2010-02-05
15OK

Beta 1.11, 3rd paragraph: “I this section with the second half …”
— missing verb ?
Beta 1.11, 4th paragraph: “I’ve left a Revision Marker and the end…”
— maybe “at” rather than “and”

2010-01-25
101OK

2nd paragraph: “Change your FlashlightAppDelegate.m file to look…”
because you are prescribing what we should do, not describing what the virgin
file looks like.

2010-02-02I can't find the issue
103SUGGEST

I had to select the Leaks display in order to see the list of leaks in the lower
half of the display. The default seemed to be to show the object allocation
history. You might want to mention that.

2010-02-02
107ERROR

Nit: “Greeter greetee” s/b “Greeter name”.

I couldn’t manage to get the “Program received signal” message even after cleaning all the targets. Twice. 10.6.2 with XCode 3.2.1 and Simulator 3.1 on a Mac Pro.

However, enabling the zombie worked as described and is very helpful.

2010-02-02
371TYPO

In the line
(return_type (^) (parameterType1, parameterType2,)) block_name

You notice there is an extra , after parameterType2

2010-02-06
135TYPO

You can click on “Failed”, the yellow triangle with the exclamation point that indicates warnings, or the red circle with the “X” that indicates errors…

In Xcode 3.2.1 the red circle doesn’t have an “X” - its an exclamation point.

2010-02-03
127OK

At the bottom: if you blank the button title, the selector will be invalid for the
trick on p 129.

2010-02-03I just rechecked it - it seems to run fine as described.
63TYPO

This problem may stem from upgrading from older versions of xcode, but when I create the HelloWorld project it does not contain the HelloWorldAppDelegate class. I hand created one and figured out the linkings (adding an NSObject to the NIB, setting it to be the File Owner’s delegate and setting the outlet to the Window object in the NIB). Some discussion on how to correct for not having the delegate class automatically generated might be in order.

2010-02-01
161SUGGEST

I found out that it’s possible to eliminate the toggling of the hidden attribute by
sending a setDisplayedWhenStopped:NO message to the progress indicator in
awakeFromNib. Then I found out that there’s an attribute for that in IB, unchecked it and eliminated the hiding/unhiding code altogether. Is there a downside to doing either of those?

2010-02-04Nice point. I've made the change.
161TYPO

Nit: In didFinishLoadForFrame, outdent “[self resetButtons];” to match.

2010-02-04
131SUGGEST

You mention “widget” several times on this page, which reminded me to ask
whether you define the term anywhere, or think you need to. P. 65 is the first
mention that I saw.

2010-02-03
164ERROR

The 3.2.1 version of IB has a button pre-placed on the toolbar, which you kind of have to dodge as you place the text field. You can use the width control on the text field to force the button to slide right. I followed your instructions to
change the button to rewind, cmd-D duped it, changed the 2nd button to FF,
disabled them, etc. Having the button already on the bar changes the rhythm
a bit from your text.

2010-02-04
170TYPO

Top of page: “set it’s look” s/b “set its look”

2010-02-04
172SUGGEST

After the bullet list at the top of the page… “Don’t forget to synthesize the backButton and forwardButton properties.” I did until I saw the build warnings.

2010-02-04
183OK

I’m not able to reproduce the error you describe in the paragraphs just before “Grrrrrr.” The console log shows 8 entries after I Cmd-Q out of iCal, and 2 more
as the result of terminating the HelloApplication app. Looks a lot like the one
you get after applying your fix, except that I have a time stamp associated with each entry. I’ll post a discussion entry.

2010-02-04My guess is that under project settings your Garbage Collection is not set to required. If that is not the case please follow up.
191TYPO

In 12.2, paragraph starting with “We’ve” has an extra apostrophe after “CurrentApp”. Font change issue?

2010-02-05
193OK

First paragraph: “There are no imports, no classes,….”
The template generates an #import <Cocoa/Cocoa.h> and you add a
@class CurrentApp;

2010-02-05The text doesn't refer to the template
194SUGGEST

Commenting out the required method “applicationDidLaunch” also gives you
back the build warning about providing and incomplete implementation of the protocol.

2010-02-05
408TYPO

In 27.1, graf 2, line 3: “way to” s/b “way too”. Since I’m currently working in
chapter 11, I have a lot to look forward to. Happy New Year!

2010-02-06
179TYPO

The third sentence in the 11.2 Solution: Creating a Model section is incomplete or contains an extra “and”
“You created a new file CurrentApp.m that was an Objective-C class that extends NSObject and .”

2010-02-04
205ERROR

Footnote 3: Apple renamed Research Assistant to “Quick Help” as of XCode 3.2,
as I found out when I tried to use the former name. The good news is that the
XCode release notes are (for the moment) in the Help menu and I found the change in the bullet list of changes from 3.1.3.

2010-02-05
211ERROR

I believe that using “for” in displayAction:for: might cause a problem under some circumstance, because “for” is a C reserved word. Notice that code
coloring treated it as a special word. Apple seems to use “for” only in combination with other words in their methods. Maybe “with” would be better?

2010-02-05
78TYPO

At the end of section 4.9 you say “In HelloWorldAppDelegate.m rename the greeter method named greetFor that takes…”. It needs re-wording, and the method should be renamed to `greeterFor` not `greetFor` (the name `greeterFor` is better, and is used on the next page).

2010-02-01
193SUGGEST

Again on the #import and @class in the ActivityMonitorDelegate.h file: I commented those lines out, cleaned all targets, built and ran successfully. So, your text is good, code example can delete those lines.

2010-02-05I've verified - and that's not the case. You need the @class because you have variables of that type
215SUGGEST

“The newly created ActivityView.xib is a cohesive collection of objects.”
The phrasing sent me back to find where I’d missed creating ActivityView.xib,
but it doesn’t happen for another page or so. Whew!

2010-02-05
125TYPO

From the user’s point of view there is no difference between these two approaches; however, there is an important difference between these two from a memory standpoint.

2010-02-03
137TYPO

“In BrowserController.h file the compiler” is missing a the between In and BrowserController.h

2010-02-03
156TYPO

The last paragraph in chapter 9.8 references to SimpleBrowserController - three times. But former project was called SimpleBrowser and controller only BrowserController.

2010-02-04
157TYPO

Hint 2: Last sentence of chapter 9.9 - the heading “Getting and Setting Frame Contents” is referenced in the “Task” section of the WebView doc.

2010-02-04
160TYPO

The last paragraph says “the SimpleBrowser header file”. SimpleBrowser is the name of the project, but I think the header file should be BrowserController.

2010-02-04
163TYPO

First sentence below the picture. “The nib contains …. MobileBrowswerAppDelegate.” There is one “w” too much.

2010-02-04
171TYPO

First sentence in chapter 10.7 references “SimpleBrowserController”. But the project name to reference is SimpleBrowser and the controller is BrowserController.

2010-02-04
207TYPO

Last complete sentence of the page in chapter 13.8. A space character is required between the words “ActivityController” and “header”.

2010-02-05
208TYPO

In the second paragraph: “…outlet named imageView…”. The fifth paragraph: “..connect the iconView”. But this is the imageView.

2010-02-05
237SUGGEST

Up to this point, all samples could be typed in Xcode and are ready to build. There is no need to have the code samples. But in chapter 15.6 there is no advise to define a property appName in IconView.h. In the code sample for IconView.h is a markup for that definition of appName. I suggest to have this definition also inside the book text.

2010-02-05
237TYPO

The second footnote looks a bit strange, because it is too wide for the page width.

2010-02-05Thanks -this will get fixed in final typesetting. It's not really a typo so much as a "needs to be typeset" issue.
252SUGGEST

In chapter 16.11 the code sample for ActivityController.h defines an action removeRow. This action is of type void. In the previous chapters actions are marked as IBAction, so I suggest to do this for removeRow too.

2010-02-05
253SUGGEST

In the code sample for ActivityController.m for the method removeRow:, I suggest to switch the type from (void) to (IBAction), as in the previous code samples.

2010-02-05
290SUGGEST

The last sentence in chapter 19.5 is a little bit ambiguous. With setValue:forKey: you can set only known properties of the object. I would limit the statement to “defined properties”.

2010-02-06
317TYPO

In chapter 20.12 should introduced a new variable with name “totalCount”. But the code samples for Counter10/UpOrDown.h doe not define the property “totalCount” nor is the getter method in Counter10/UpOrDown.m called “totalCount”. There is only a method “myTotal”. So the code samples should be updated to match the text.

2010-02-06
338TYPO

In chapter 22.3, near bottom of the page, you find “…String attributes named bookTitle”. But the property is named “title”.

2010-02-07
366SUGGEST

In the code sample for CDBookshelf11/CDBookshelf_AppDelegate.m the import statement “NSManagedObject+Report.h” is replaced with “PragBook+Report.h”. But there is already a compiler warning, that “‘NSManagedObject’ may not respond to ‘-PP_report’”. Is there any hint you can give, how to solve this warning?

2010-02-10
195ERROR

The book example for CurrentApp.h on page 191 leaves out the #import “ActivityMonitorDelegate.h” statement. This does not cause any difficulty until page 195 when calls the delegate methods are introduced. Then the complier generates struct warning on the [self.delegate applicationDidLaunch:self] and [self.delegate applicationDidTerminate:self] statements and the code fails to execute these statements.

2010-02-05
63OK

HelloWorldAppDelegate class: i am having the same error as the person that reported this before me; although i found out how to work around this problem: stackoverflow.com/questions/2076810/appdelegate-file-missing-in-xcode-3-1

please, add the information on how to create delegate classes and link them from interface builder, so people can use your examples and your book. thanks!

2010-02-01I understand your issue, however this book was ported to Xcode 3.2 and assumes you are using those tools. \n \nD
227TYPO

“Keep you eye on your nib files” (last paragraph) should be “Keep your eye on your nib files”

2010-02-05
237SUGGEST

I have found the flow of this book to be really good up to this point, but the order of presentation of sample code here is really strange. You quickly fall out of the pattern of read-code-build-test that has been consistent prior to this point because your builds suddenly fail because of the setup required to make the application name text draw to work properly isn’t explained until later on.

Might make sense to present the preparation and dictionary assignment first, and then the view presentation components second. Otherwise, you can’t follow along with comparing your results with the textbook unless you skip ahead, and then jump back.

2010-02-05
284SUGGEST

It might make more sense to instruct to open the project first, build the classes, and then proceed with the sample code so that you don’t end up going backwards to pick up the sample code for PragBook.h etc.

2010-02-06
294TYPO

The following sentence (beginning of 19.8) should be adjusted for grammar/misplaced apostrophe:
Currently: KVC let’s us fill a table as easily as we filled one from a dictionary earlier.
Should be: KVC allows us to fill a table…

Cheers,

2010-02-06
237ERROR

I ran into a bit of trouble trying follow the process for displaying text as it appears in the default" look as described in section 15.6 Drawing Text. I found that I needed to make the following changes to get text to appear in the “default” look:

1. ((IconView *)self.view).appName = app.localizedName was never implemented in displayColor method.

2. [self.appName drawInRect:textRect withAttributes:nil] needs to be implemented in drawRect method not awakeFromNib.

2010-02-05
258ERROR

I had to declare the property dataFile with copy, and not assign, otherwise I would receive a exec bad access error. In the book it’s not specified the type of the property, so I assumed it was assign.

2010-02-06I've added a note about this, but you should have seen a compiler warning that advised you to do this.
29TYPO

“This section let’s you remove much of your controller code and even some of the model code.” - should be “lets”.

2010-01-25
391TYPO

In SpinnerOperation.h you declare:
-(id) initWithSpinner:(NSProgressIndicator *) spinner;
Whereas, in SpinnerOperation.m your implementation is described as:
-(id) initWithSpinner:(NSProgressIndicator *) newSpinner {

I believe the .h needs to be adjusted to handle newSpinner.

2010-02-10
217TYPO

In the last paragraph at the bottom of the page and in the next paragraph on page 218, “Activity.xib” should be “ActivityView.xib”.

2010-02-05
227TYPO

In the first paragraph after the bullet points, second sentence, the word “menu” should not be inside the parenthesis with “unused”.

2010-02-05
33OK

In section 2.2, it says: “Double-click on MainMenu.xib(English) in the Xcode window.” Shouldn’t this be MainMenu.nib ?

2010-02-10
29TYPO

Second paragraph, first sentence:
The third section focuses on more sophisticated ways in which send
and receive messages.

Should be “..in which to send..”

2010-02-10
90TYPO

Last paragraph refers to the “NSCopy protocol”. I’m running 3.2.2 and it’s referring to this as the “NSCopying protocol”

2010-02-10
105SUGGEST

The footnote:
3. If you don’t see this message try to do a Build > Clean All Targets and Build & Run again.

made all the difference — but it was only after going back and forth a couple of times. Suggestion:
(1) elevate higher than footnote — insert a sentence suggesting this, and
(2) add a footnote to explain why this was needed — us newbies could use some guidance as to when we should expect to have to do a clean all during normal development

2010-02-10
132SUGGEST

Ok, so really a nit: At the start of section 8.2, before saying “In Xcode choose File>New File…” how ’bout an explicit “Open the SimpleBrowser project that we created earlier in Xcode”

((ok, ok, so I’m being even more anal than usual))

2010-02-10
33TYPO

“…after a moment of compiling and linking you’ll see an empty window with the title “Window” and a menu bar populated…". In my case, the empty window is titled SimpleBrowser, rather than Window

2010-03-04
49TYPO

“…Because we chose release as our target instead of build…”. Should this read ‘instead of debug’?

2010-03-04
56TYPO

“…In Java of C# you might write…”, perhaps should be “Java or C#”

2010-03-04
108TYPO

“Over time, it will grow and grow, sometimes to the point where is can no longer run (or it prevents other programs running).”

Should be:

Over time, it will grow and grow, sometimes to the point where it< can no longer run (or it prevents other programs running).

2010-03-04
113TYPO

“First, I want to show you where the Garbage Collector can and can’t help with when it somes to the mem- ory attribute for properties.”

Should be:

“First, I want to show you where the Garbage Collector can and can’t help with when it comes< to the mem- ory attribute for properties.”

2010-03-04
74TYPO

Last line contains “ALthough”.

2010-03-04
126TYPO

Top of the page says: “We still have memory leaks in Greeter.m in the sayHello and description methods. Take a look at the sayHello method.”
There is no mention of sayHello before this, shouldn’t it be referring to the ‘greeting’ method?

2010-03-04
88TYPO

In the code example the indentation of the second NSLog is incorrect.

2010-03-04
91TYPO

incorrect indentation of the NSLog in the code example.

2010-03-04
62TYPO

The line that reads “The equivalent in Java of C# might be something like this:” should read like this: “The equivalent in Java or C# might be something like this:”

Change the “of” to “or”.

2010-03-04
84SUGGEST

In section 4.8 Further Refactoring the code used is
Greeter *greeter = [self greeter];

Previously, we were told to use
Greeter *greeter = [[Greeter alloc] init];

I’m a little confused.
I know it’s related to the code
return [[Greeter alloc] init];
as shown later, but I just don’t get the explanation.

2010-03-04
214OK

First paragraph following the code snippet at the top of the page is:

You ask the delegate if it implements the method before you call it. You
check by sending the respondsToSelector: message to the delegate and
pass in the name of the method you are checking on.
Build & Run. You should see the message “Delegate implements applicationDidLaunch:.”
in the Console window.

What I see is:

2010-02-17 15:00:22.688 HelloApplications[7655:a0f] We’re on our own.
2010-02-17 15:00:22.689 HelloApplications[7655:a0f] Delegate implements applicationDidLaunch:.

I’m a bit confused…..

2010-03-04I've rerun the code following the specified steps and I still get the results I describe. I'm not seeing what you see.
227OK

Last paragraph before 13.8 reads:

Before moving on, remove all of the highlighted lines in the header and
implementation files for CurrentApp. They don’t do any harm, but they
clutter up the example a bit and now that you know how to create and
work with a mutable dictionary we don’t need to keep them around.

I have no idea what you’re talking about here :) What “highlighted lines”? Do you mean remove all the code we just entered for the mutable dictionary only???

2010-03-04the lines that are highlighted in the code listing, changed
259ERROR

At top of the page, you show the output example with app icon with the application name, but you
didn’t tell us to add:

\t((IconView *)self.view).appName = app.localizedName;

into IconViewController.m > displayColor method yet, so no name shows up.

2010-03-04
273TYPO

2nd paragraph of text on the page is:

Back in Xcode, you should have added these two methods to your
implementation file for HelloAppTableViewController. Then add and remove
the appropriate entry to the runningApps array and then tell the table
view to reload.5

What’s the “HelloAppTableViewController”?? Do you mean “Activity Controller”?

2010-03-04
278TYPO

LAST PARAGRAPH ON THE PAGE STARTS WITH:

“Build & Run.”

arrrggh

ARRRRGGGGGHHHHHH!!!!!!!!!!!!!!!!!!!

Maybe you didn’t really intend for someone to follow along in the book and type the code as he went — maybe you really intended for someone to keep re-loading the sample code……

ARRRGGGHHH!!!!!!!!!!!!!

Up until “Build & Run”, you don’t mention the little detail of including BanishedApps.h in ActivityController.h and adding the banishedApps instance variable……….

Ok, so maybe I’m too cranky about this….
… but, if you had just added a printout of ActivityController.h prior to the “Build & Run” I wouldn’t be whining so bloody much.

2010-03-04
294SUGGEST

(Just a nit:) When you show the code snippet for chooseViewer, you use:
-(void) chooseView: (id) sender …

it’s a bit confusing for newbies. Yes, in NSNibDeclarations.h it’s #defined as “void”, but in your earlier example of toggleLoadSavedRemovedApps: you use:
-(IBAction) toggleLoadSavedRemovedApps: (id)sender

A reminder here or somewhere earlier in the text would help avoid this confusion.

2010-03-04
306SUGGEST

Last paragraph on page:

Add another Objective-C class named BookshelfController. For now, BookshelfController will contain a single PragBook instance.

Just for context, and for newbies, you might remind us to make it a NSWindowController instead of the default NSObject.

2010-03-04
173ERROR

“You need to add this method to SimpleBrowserController.m” -> “You need to add this method to BrowserController.m”

2010-03-04
111TYPO

“it’s reference count never reaches zero” -> “its reference count never reaches zero”

2010-03-04
306TYPO

Typo in my suggestion #42337: Last paragraph on page:

my reference to “NSWindowController” should be “NSViewController”

(dang, there goes my smug little grin)

2010-03-04
222ERROR

The first code fragment in section 13.5 shows a respondsToSelector: test in applicationDidXxx:; however, these tests were removed as an optimization at the end of section 12.9 (Cleaning Up). While you do mention that you reinserted this check a little further down, the reappearance of the test in the first fragment is potentially confusing, since it does not reflect the current state of the code, if the reader has been working through the exercises.

2010-03-04
227ERROR

“Before moving on, remove all of the highlighted lines in the header and implementation files for CurrentApp”… Er… what highlighted lines? I’m not sure what you mean here.

2010-03-04
226ERROR

“When I run the application and start up iCal and Safari and then quit Safari I see this in my console window.”

The sample output that follows only appears to reflect starting iCal; there is no Safari activity shown.

2010-03-04
229TYPO

“is contained in the instance of the NSRunningApplication with the key NSWorkSpaceApplicationKey” -> “NSWorkspaceApplicationKey”, with a lower case ‘s’. I worked ahead without looking at the solution, using “NSWorkSpaceApplicationKey” as the key—and couldn’t figure out why it wasn’t working.

2010-03-04
76TYPO

the code in the middle of this page has two levels of dot notation used “self.window.contentView”, but the prior (and later) listings of this piece of code only have “[self.window contentView]”. Same result, but not consistent.

2010-03-04
237TYPO

“One of my goal’s” -> “One of my goals”

2010-03-04
317SUGGEST

Last paragraph of 19.9 tells us we’ve got enough rope to hang ourselves.

One thing I didn’t do was to remove the lines in BookshelfController.m (that we just added):

-(PragBook *) book {
if (!book) {
self.book = [[PragBook alloc] init];
NSDictionary *bookInfo =
[NSDictionary dictionaryWithObjectsAndKeys:
"Manage Your Project Portfolio", “title”,
"Johanna Rothman", “author”, nil];
[self.book setValuesForKeysWithDictionary: bookInfo];
—> [self.book setValue:"Preface" --> forKeyPath:“chapter.chapterTitle”];
—> [self setValue:[NSNumber numberWithInt:4]
—> forKeyPath:@“book.chapter.pageCount”];
}
return book;
}

While I appreciate “the rest is left to the student as an exercise”, and I have grown through the experience, and am a better person for it — the subtlety of “book.chapter” vs. “book.chapters” causing the:

Bookshelf[8361:a0f] [<NSCFString 0x200095440> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key chapterTitle.

error caused me to pause and think you might want to mention it as a “this is why you got that screwy error” footnote or something so that we will continue to revere you as the All-Knowing-Wizard-Of-All-Things-Cocoa that you clearly are :)

2010-03-04
339TYPO

Last sentence sentence on the page page:

“Unfortunately, there currently currently isn’t any support for bindings for iPhone OS.”

2010-03-04
183TYPO

Second paragraph: “We’re not going to cutomize the (…)”
Should be “Customize” (you’re missing an “s”)

2010-03-04
23TYPO

Second to last paragraph: “the the”

2010-03-04
212SUGGEST

I’m just a beginner with Cocoa and I’ve really enjoyed your book. However, I’ve had a lot of problems trying to get things straight in my head in the chapter “Creating Protocols for Delegation”. The problem is that I’m trying to think of delegation in the same way we did with the Web Browser example previously. In this previous case, the WebView object had delegates that we put in our Control object. Those delegates names like WebFrameLoadDelegate with specific methods that were implemented in our controller class. The names of the delegate set had Web in them which linked them to WebView in my mind. In the Chapter 12 example, however we call the delegate file ActivityMonitorDelegate. To be consistent with WebView example, shouldn’t we call this delete .h file CurrentAppDelegate? I was having a really hard time trying to understand this chapter because it looked like ActivityController was using the delegate ActivityMonitorDelegate to point to Activity Controller (sorta) [incorrect understanding I now realize]. Anyway, for me it was very confusing until I realized if the delegate file was simply renames CurrentAppDelegate everything would be consistent with what I already knew from previous chapters. (Hope I’m right - if not, it would be great if you could let me know, though I’m sure you’re probably way too busy for that).
Cheers,
David
-Great book!

2010-03-04Sure - the key is that the delegate is responsible for performing actions for the delegating object. Take a look at my window delegate example - does that help?
106OK

After removing the instance vars, shouldn’t only having name as an argument to initWithFormat: in the description method fail? Should this need to be changed to self.name? When I tried this it didn’t fail when I left it as just name.

2010-03-16
65TYPO

The last sentence of page 65 and the second sentence of page 66 are the same.

Seems like a duplicate paragraph.

“The WebView object sends a message back to the object sending the takeStringURLFrom: message asking for its string value.”

2010-03-16Thanks, one is illustrating the other
31ERROR

I’m using Xcode 3.2.2 (Pre-release) (the beta 5 with iPad support) and the SimpleBrowser throws an error and won’t start unless I add the WebKit Framework to my project first. The text says “It is part of a separate frame- work that you will have to link into your project later using Xcode.” but this is never described before running the app.

I suspect this is due to me using 3.2.2 of Xcode but figured I’d pass it along anyways.

2010-04-01
65ERROR

The book states: "Fortunately, the Cocoa Application template created an application del- egate for us named HelloWorldAppDelegate. You’ll find the source files in the Classes folder under Groups & Files. (footnote 2)

(footnote 2) 2. If you don’t find these files, you are probably using Xcode version 3.1 or earlier and need to move to Xcode 3.2 or later."

I’m using Xcode 3.2.1 and it DOESN’T create these files. If there’s a switch that needs to be set, please make that clearer. Thanks.

2010-04-01
197OK

I do not get any output from the initial version that is not tied to the HelloApplicationAppDelegate:

[Session started at 2010-03-28 10:46:17 +0800.]
GNU gdb 6.3.50-20050815 (Apple version gdb-1346) (Fri Sep 18 20:40:51 UTC 2009)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type “show copying” to see the conditions.
There is absolutely no warranty for GDB. Type “show warranty” for details.
This GDB was configured as “x86_64-apple-darwin”.tty /dev/ttys000
Loading program into debugger…
Program loaded.
run
[Switching to process 14900]
Running…

Debugger stopped.
Program exited with status value:0.

This is a fresh install of 3.2.1 for iPhone on a 64-bit for a 64-bit. It works fine once I tie it together — perhaps the GC or the optimization is more aggressive in this target?

-Paul
paul.covell@gmail.com

2010-04-01Sorry but I'm unable to see what you're seeing.
64TYPO

The erratum I reported yesterday has been resolved. I’ve removed Xcode 3.2.1 from my Mac and installed 3.2. It now produces results identical to those shown in the ebook.

2010-04-01
252ERROR

You do not see this “default” look until you add the following line to IconViewController.m:

((IconView *)self.view).appName = app.localizedName;

This isn’t mentioned (shown) until the bottom of page 253

21TYPO

In “Starting Fresh”, the sentence “These problems manifest themselves in different ways but are often surface when dealing with nib files.” should be “…but often surface…”.

87TYPO

“The return type ofinitWithName: is id.” There should be a space after “of”.

88TYPO

In footnote 2: “We’ll look at theIBAction return type in Chapter 7” there should be a space before “IBAction”.

168SUGGEST

For the following code:

- (void)webView:(WebView )sender didReceiveTitle:(NSString)title forFrame:(WebFrame *)frame {
[[sender window] setTitle:title];
}

I’ve found that the delegate method is called for iframes within a page as well, changing the window title to it’s title.

You might want to change it to the following and mention the issue:

-(void)webView:(WebView )sender didReceiveTitle:(NSString)title forFrame:(WebFrame *)frame {
if(frame == [sender mainFrame]) [[sender window] setTitle:title];
}

53TYPO

The text reads:


The return type of goBack is BOOL. You can see by the Discussion section that in Objective-C the two boolean values are YES and NO and not true and false.
—-

In fact, this is contained in the Return Value section in the figure.

54ERROR

The footnote states that the return type of goBack: is IBAction, but the documentation seems to clearly indicate that it’s void.

This could be a quirk of Apple’s documentation; searching for goBack: in the documentation browser shows that PDFView’s goBack: method does return IBAction.

17TYPO

“They are unfamiliar, so your first instincts won’t always be right. but in no time you’ll be typing in what you assume the method”

Shouldn’t the fullstop after right be a comma?

101SUGGEST

The code in Hello World 16:
-(void)applicationDidFinishLaunching:(NSNotification *)aNotification {
Greeter *greeter = [self greeterFor:"Maggie"]; \tNSLog(“Greeter: %@”, greeter);
NSTextField * label = [self labelWithText:[greeter greeting]];
[self setUpperCaseName:greeter];
[[self.window contentView] addSubview:label];
}
might lead one to suppose the result should be in upper case - penultimate line. It obviously doesn’t but it is unnecessarily confusing for someone learning Cocoa. Suggest a footnote to explain pr fix the code.

112ERROR

Text in penultimate sentence before section 7 -
“That is enough information for us to find the leak, although if you double-click the line reporting the leaked Greeter object, you will be taken to the offending lines in the source code.” Double clicking doesn’t do anything. You much click the arrow in the address column and then double click the result.

114ERROR

First sentence on page:

“Choose the menu item Build > Build & Debug. You should see a boilerplate message in your Console window followed by something like this:”.

I cannot get this to work whatever I do including cleaning target and using the downloaded code.

114ERROR

If I use the downloaded code for Flashlight4 I get the following response minus the last line:

“Greeter name: Maggie created: 2009-09-18 14:24:43 –0400
objc[11179]: FREED (id): message respondsToSelector: sent to freed object=0x3b06760
Program received signal: ‘‘EXC_BAD_INSTRUCTION’’.”

There does not appear to be a reference to Flashlight 4 in the text.

168TYPO

Doesn’t the line of code:
“[sender window] setTitle:title]”
break the author’s own injunction to use dot notation?
Should it not be:
"[sender.window setTitle:title]?

126TYPO

Second paragraph from the bottom. There is a ‘space’ missing before IBOutlet.

178TYPO

The paragraph preceding Section 10.3. contains the sentence:
“If you click in another area of the screen, the keyboard is dismissed, but the next time you select the text field, the URL will be cleared, and you need to start all over again.”
I have followed the instructions (I think) and when I select the text field the URL is not cleared.

211SUGGEST

The code for this section contains an instance of ActivityController ac. This is used as an outlet from the AppDelegate but it serves no apparent purpose and is very confusing. The code runs perfectly well when all traces are removed. If it does have a purpose please explain it, if it doesn’t please get rid of it. When one is trying to learn such inconsistencies cost a lot of time and effort.

235TYPO

Either the last word on the page should be NSTextField not NSTextView or the HelloApplication18 download is in error.

228TYPO

The download HelloApplication18 contains currentApp in HelloApplicationAppDelegate, it appears to serve no purpose and is confusing. If it does serve a purpose please explain it. If it doesn’t serve a purpose please so indicate in a footnote. Poor beginners such as myself can waste a lot of time chasing the function of such items

16TYPO

Typo in paragraph 2: “You’ll be tempted to hold on the way you used to do things.” should be “You’ll be tempted to hold on to the way you used to do things.”

58TYPO

Last paragraph, 2nd sentence starts “I’ll add code some of” should be “I’ll add some of”.

90TYPO

In section 5.3, the setter method initially reads as “-(void) setName:(NSString *) name;” while it should be “-(void) setName:(NSString *)newName;”. This mistakes is corrected on the very next page when the implementation is shown.

282SUGGEST

You suggest typing in the short plist file (or constructing it programmatically). It is much easier to use the Property List Editor which comes in the Utilities folder. This would also give new users a taste of using the Property List Editor.

321SUGGEST

Here is another way to solve the problem of several observations: use the context variable. In Display.m, awakeFromNib, use [counter addObserver: self forKeyPath "countOne" .... context selector(updateDisplayOne:)] (and similarly for countTwo and updateDisplayTwo: ). Then observeValueForKeyPath: …
reduces to one line:
{ [self performSelector: context withObject: [object valueForKeyPath: keyPath]]; }

69ERROR

This line in the sample code under section 4.10 ‘Logging Objects’ produces 2 errors ‘LINE’, and ‘FILE’ not defined:
\tNSLog("This occurred in % at line %d in file %s.", NSStringFromSelector(_cmd),LINE, FILE);

212202ERROR

Error or not error? - You are writing:

“Click Build & Run, and your application should run exactly as before.
We’re now receiving notifications when applications launch or terminate …”

My code is exactly the same as your code I have downloaded. I have never received a notification when application terminates. Principally, how could ‘Terminated’ be displayed after the application has terminated? Should we not apply something like ‘applicationWillTerminate’ or ‘applicationShouldTerminate’ to get an appropiate message?

Gerhard

232ERROR

After the following of chapter 14 - Multiple Nibs, i’ve discovered that it is possible to resize the window when it runs. When you start resizing the NSImageWell and NSTextfield start flying all over the window and out of it.

I compared it with the sample code (Multiple Nibs - hello applicaton21) and this too has the same “strange” behaviour.

The setting of the setContentSize does work well initially, but i think somehow the view should lock.

195TYPO

In section 12.3, “The delegate was a WindowHelper object that extended NSWindow” should be replaced by “The delegate was a WindowHelper object that extended NSObject”.

109SUGGEST

Omission: A common error is to leave the dropdown on the topleft with “Device” selected. Any unregistered developers would then see an error. It would be helpful to add in the suggestion to select “Simulator” before the beginning of “Click Build & Run” on the 5th paragraph.

40SUGGEST

The book states: “In the top-left corner of your Xcode window, you will see the warning that the application is
TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION” but i cant see this at any place.

In the bottom-left of Xcode windows I see:
GDB: Program received signal: “SIGABRT”.

212202TYPO

Solution of the problem:
212\t202\t#46183: Error or not error? …

Solution: Because OS 10.5.8 does not support Xcode 3.2.5, I use running Xcode on a server (mini Mac OS 10.6.6. Intel Core 2 duo) remotely administered on a PowerPC G5 (OS 10.5.8). When opening iCal or any other program on that local administrator computer which does not host the running Xcode the problem shows up. But when iCal or any other program is opened on the server (where Xcode and the code is running) then the code works correct. - Sorry for my misleading question: Error or not error? …

205ERROR

The 3rd footnote states an Objective-C protocol is similar to an Interface in Java.
If you implement a Java Interface, you have to implement all its methods.
A Java Adapter is a dummy class that implements an Interface, containing empty bodies. Hence you can inherit from an Adapter, only overriding those methods you need.
One example is the Java Interface is WindowListener and its Adapter is WindowAdapter.

171TYPO

The sentence in footnote 5 has an agreement problem: “Other methods we often use … is …” should be “Other methods we often use … are …”

316ERROR

“I’ve chosen to update the display with the new value that I pull off the ”change" dictionary.

Line 5 reads:
[self updateDisplay:[object valueForKeyPath:keyPath]];

In fact, the author is pulling the value from the object ( in this case, “UpOrDown” )

this call seems to fulfill the intent of the author.

[self updateDisplay:[change valueForKeyPath:@“new”]];

283ERROR

In the loadView method, I found I needed to replace
ofType:nil
with
ofType @“plist”
(Xcode 4, OS Lion)

283ERROR

In the loadView method, I found I needed to replace
ofType:nil
with
ofType: @“plist”
(Xcode 4, OS Lion)

41ERROR

Not so much an error, but the later versions of Xcode (mine is 4.2) don’t have Add > Existing Frameworks. This describes this is the new gui steps for adding the webkit framework:

stackoverflow.com/questions/3352664/how-to-add-existing-frameworks-in-xcode-4

Of course, many other things have changed in XCode 4, but Just listing this in the errata would have saved me a bunch of time poking around trying to match things up (most other things up until there had been easy enough to guess around).

Great book so far, thanks! Hoping there’s an update for XCode 4.x in planning…

Categories: