マーリンアームズ サポート   翻訳   コンサル   講座   アプリ   コラム

iPhone SDK アプリケーション開発ガイド Jonathan Zdziarski著 近藤誠監訳  武舎広幸+武舎るみ訳

正誤表

下記の誤りなどが見つかりました。お手数ですがご変更ください。

目次

確認済みのもの

行等 変更前 変更後 公開日
(月日年)
7刷
まで
88 25 - (id)initWithAppDelegate:(id)appDelegate の中の "if (self != nil) {... }" は不要になったようです。
UINavigationController Class Referenceによると "In iOS 3.0 and later, the contents of the built-in navigation toolbar are updated to reflect the toolbar items of the new view controller. " とありますので、iOS 3.0以降でこのような仕様になったのかもしれません。
「戻るボタンは自動的に作るからプログラマーはいじくるな」ということかと思われます。
12/4
/2011
7刷
まで
61 いちばん下 loadViewの定義
  - (void)loadView {
    [ super loadView ]; /* ←この行を追加 */
    CGRect bounds = [[UIScreen mainScreen] applicationFrame];
    ...
"- (void) loadView {" の下に"[super loadView];" の行を追加してください(原著でも抜けておりましたが、チェック漏れです)。 11/10
/2011
6刷
まで
382 関数interruption controler controller 今のママでもプログラムは動きますが、スペルが違いますのでご訂正ください。 9/8
/2011
6刷
まで
346 10
margin.width += (size.width - cellSize.width * [_covers count]
                -  spacing.width * ([_covers count] - 1)) * 0.5;
margin.width = floor(margin.width);
↓
margin.height += (size.height - cellSize.height * [_covers count]
		 -  spacing.height * ([_covers count] - 1)) * 0.5;
margin.height = floor(margin.height);
margin.widthはこれ以降で使われておらず margin.heightの計算が必要と思われます。ただ、このコードは原著者がだいぶ試行錯誤したようで、意図がはっきりとわからなくなっている部分があるように思われます。 4/19
/2011
6刷
まで
346 10
[layer scrollTopoin:CGPointMake(0,
  rect.origin.y - (([layer bounds ].size.height - cellSize.width)/2.0))];
↓
[layer scrollTopoin:CGPointMake(0,
  rect.origin.y - (([layer bounds ].size.height - cellSize.height)/2.0))];

正方形なのでcellSizeのheightもwidthも同じため、結果は変わりませんが、heightのほうが「正しい」と思われます。 4/19
/2011
6刷
まで
266 31
UITableViewCell *cell =
   [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  ↓
UITableViewCell *cell =
   [ [tableView dequeueReusableCellWithIdentifier:CellIdentifier]  retain];
retain が抜けていました。なお、ダウンロードページのソースコードにはretainがついています。 4/9
/2011
5刷
まで
346 下から19行目
   http://www.zdziarski.com/demo/
      ↓
   http://www.marlin-arms.com/support/ipsdk/images/touchdemo/
 
原著者が画像を削除してしまいましたので、このサポートページに画像をおきました。URLを変更してください。 10/26
/2010
5刷
まで
340 下から2 [NSUserDefaults standardUserDefaults dictionaryRepresentation]; [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
9/29
/2010
5刷
まで
343 下から6 ここから始まるCovertFlowViewController.mについて以下の変更が必要です。
20行目:cfIntLayer = [[CAScrollLayer alloc] init];
155行目:covers = [[NSMutableArray alloc]init];
上記の2つに関してdealloc関数内にreleaseが必要です。

159行目:UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL: ...]]
上記に関して、生成の際にautoreleaseをつけるのが的確です。
 [image autorelease];
9/29
/2010
5刷
まで
229 下から2 <変更前>
//
// EmailsAppDelegate.h
// Emails
#import <UIKit/UIKit.h>
@class EmailsViewController;
@interface EmailsAppDelegate : NSObject <UIApplicationDelegate> { 
  UIWindow *window;
  EmailsViewController *viewController;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet EmailsViewController *viewController;

@end
      
EmailsAppDelegate.mのソースを載せるべきところにEmailsAppDelegate.hのソースを載せてしまいました。 9/18
/2010
<変更後>
//
//  EmailsAppDelegate.m
//  Emails

#import "EmailsAppDelegate.h"
#import "EmailsViewController.h"

@implementation EmailsAppDelegate

@synthesize window;
@synthesize viewController;


- (void)applicationDidFinishLaunching:(UIApplication *)application {    
    
    // Override point for customization after app launch    
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];
}


- (void)dealloc {
    [viewController release];
    [window release];
    [super dealloc];
}


@end
      
5刷
まで
75 下から11
      NSString *pageData = [NSString stringWithContentsOfURL:url];
       ↓
      NSError *error;
      NSString *pageData =
        [NSString stringWithContentsOfURL:url
                  encoding:NSUTF8StringEncoding error:&error];
      
NSStringのメソッドstringWithContentsOfURL:は廃止予定(deprecated)となりました。そのままでも動きますが、 stringWithContentsOfFile:encoding:error: あるいは stringWithContentsOfFile:usedEncoding:error: を使う方がよいでしょう(文字コードを指定してページを読むか、あるいは読み込んだページのコードを返してもらいます)。詳しくはAppleのドキュメントをご覧ください。 7/8
/2010

4刷
まで
371 下から2 下から2行目から、次のページの7行目までを削除してください。その下の内容と重複してしまっています。
6/13
/2010
4刷
まで
149 下から8と
14行目
   http://www.zdziarski.com/demo/
      ↓
   http://www.marlin-arms.com/support/ipsdk/images/touchdemo/
 
原著者が画像を削除してしまいましたので、このサポートページに画像をおきました。URLを変更してください。 7/6
/2010
4刷
まで
354 19と
22行目
4刷
まで
287 5と
8行目
5/11
/2010
4刷
まで
198 下から7 sizeof(buffer) -; recv_len); sizeof(buffer) - recv_len); 余分な「;」が入ってしまいました。 4/21
/2010

3刷
まで
138 3
   NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:
   @"http://www.zdziarski.com/demo/%d.png", i+1]]; 
      ↓
   NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:
   @"http://www.marlin-arms.com/support/ipsdk/images/touchdemo/%d.png", i+1]]; 
 
原著者が画像を削除してしまいましたので、このサポートページに画像をおきました。URLを変更してください。 4/8
/2010
3刷
まで
180 コードの下
7行目
非常に歌劇なので 非常に過激なので 2/12
/2010
3刷
まで
141 下から10 ポスター版 ポスター板 1/6
/2010
3刷
まで
81 下から5 丈夫に 上部に 1/6
/2010

2刷
まで
203 4 4行目の「/* サーバソケット */ 」から、下から6行目の「/* 接続を待つのではなく、独自の処理を続ける */」までを削除してください。 修正する前のコードと修正したコードの両方を重複して載せてしまいました。 12/3
/2009
2刷
まで
205 下7 「7.1.6 発展課題」の上に、以下を追加してください。
クライアント側のコードを独自に書くとすると、たとえば次のようになります。
	static char joke[] = "Why did the chicken cross the road?
";
	CFSocketRef client;
	CFSocketContext CTX = {0, joke, NULL, NULL, NULL};
	client = CFSocketCreate(kCFAllocatorDefault,
	   PF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketDataCallBack,
	   DataCallBack, &CTX);
	CFRunLoopSourceRef sourceRef
	  = CFSocketCreateRunLoopSource(kCFAllocatorDefault, client, 0);
	CFRunLoopAddSource(CFRunLoopGetCurrent(),
	                   sourceRef, kCFRunLoopCommonModes);
	CFRelease(sourceRef);

	struct sockaddr_in addr;
	memset(&addr, 0, sizeof(addr));
	addr.sin_len = sizeof(addr);
	addr.sin_family = AF_INET;
	addr.sin_port = htons(PORT); //サーバーのポートを入力
	addr.sin_addr.s_addr = inet_addr(ADDR); //サーバー側のIPアドレスを入力
	NSData *address = [NSData dataWithBytes:&addr length:sizeof(addr)];
	CFSocketError error = CFSocketConnectToAddress(client,
	                          (CFDataRef)address, 2);
	if (!error) {
		NSData *sendData = [NSData dataWithBytes:joke length:strlen(joke)];
		CFSocketSendData(client, address, sendData, 10);
	}


static void DataCallBack(CFSocketRef socket, CFSocketCallBackType type,
	CFDataRef address, const void *data, void *info) {
	NSLog([[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
	return;
}
  12/3
/2009
2刷
まで
xx 下9 3.2.5 ビューコントローラ 3.2.5 UIViewからの派生  
2刷
まで
56 1
2刷
まで
170 6 <引数inCallbackRunLoopの説明がありません> inCallbackRunLoop
inCallbackProcによってコールバック関数が指しているイベントループ。NULLを指定するとオーディオキューの内部スレッドのひとつに対して呼ばれます。
inCallbackRunLoopの説明が抜けてしまいました。 12/4
/2009

1刷 170 12 outAO outAQ 「O」ではなく「Q」です。 9/28
/2009
87 5 <変更前>
#import <UIKit/UIKit.h>
#import "RootViewController.h"

@interface PageDemoAppDelegate : NSObject  {
	UIWindow *window;
	RootViewController *viewController;
	CreditsViewController *creditsViewController;
	UINavigationController *navigationController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet RootViewController *viewController;
@property (nonatomic, retain) IBOutlet CreditsViewController *creditsViewController;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;

@end
RootViewController.hのソースを載せるべきところにPageDemoAppDelegate.hのソースを載せてしまいました。 9/13
/2009
<変更後>
#import <UIKit/UIKit.h>

@interface RootViewController : UIViewController {
	UITextView *textView;
	UIBarButtonItem *credits;
	int page;
	UISegmentedControl *segmentedControl;
	UINavigationController *navigationController;
}
- (void)setPage;
- (id)initWithAppDelegate:(id)appDelegate;
@end
@interface CreditsViewController : UIViewController {
	UITextView *textView;
	UINavigationController *navigationController;
}
- (id)initWithAppDelegate:(id)appDelegate;
@end

未確認のもの

ご連絡いただいたもののまだ確認をできていないものです。いただいた内容をそのまま掲載させていただいております。

ご参考

読者の方が困った(はまった)箇所だそうです。ご参考までに。