正誤表
下記の誤りなどが見つかりました。お手数ですがご変更ください。
- 重要な訂正は背景に色が付いております。
- 例題などがうまく動かない場合は、付録2 デバッグの参考もご覧ください。
- 原著者が画像を削除してしまった例があり、それらについてはこのサポートページに画像をおくようにしていますので、ソース中のURLを変更してください(すべての画像を準備したつもりですが、もし漏れがありましたらご連絡ください)。
- この本はiPhone SDK のバージョン3の時点で作成したものであるため、XcodeやInterface Builderの図やウィンドウのタイトルなどが一部変わっているものがあります。できる限り変更点をお知らせしていくつもりですが、画面と多少の違いがあっても同じように動く場合がほとんどですので、不都合が生じない限り先に進まれることをお勧めします。もし、うまく行かない場合は、ご連絡用ページからご連絡ください。
- お気づきの点はご連絡用ページからお知らせいただけると幸いです。ご連絡いただいた方、ありがとうございます。 必ずお返事を差し上げますが、しばらくお時間をいただく場合がありますので、あらかじめご了承ください。3日以上立っても音沙汰がない場合は、不着の可能性がございますので、再度お送りください(ご連絡用ページに記載のメールアドレスまでメールでお送りください)。
- 調査に時間がかかる場合など、解答(正解)をお答えできない場合がありますので、悪しからずご了承ください。
目次
確認済みのもの
刷 | 頁 | 行等 | 変更前 | 変更後 | 注 |
公開日 (月日年) |
---|---|---|---|---|---|---|
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 |
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 |
未確認のもの
ご連絡いただいたもののまだ確認をできていないものです。いただいた内容をそのまま掲載させていただいております。
-
P.207~208のサンプル
誤 CFReadStreamSetClient(readStream, kCFStreamEventHasBytesAvailable, readCallBack, NULL); ↓ 正 CFReadStreamSetClient(readStream, kCFStreamEventHasBytesAvailable, readCallBack, &CTX);
CFReadStreamSetClient関数第4引数のclientContextはリファレンスによると、 「If NULL, the current client for stream is removed.」 となって、コールバック指定が無意味になってしまうようです。 -
P.208 1行目
誤 kCFtreamEventHasBytesAvailable ↓ 正 kCFStreamEventHasBytesAvailable
-
P.392 下から4行目(2011年9月8日)
誤 self = [superinit]; ↓ 正 self = [super init];
-
P.377 B.1 Audio Sessionについて、
説明文の手順どおり作業していくとP.379のプログラムがうごきません。
AVFoundation.frameworkの追加に関する話が割愛されています。 -
14章 Media Playerフレームワーク
iOSの仕様変更があったらしく、明示的に メディアプレイヤーのViewを割り当ててやらないと、画像が出ないようです。[moviePlayer.view setFrame:CGRectMake(0,0,320,320)]; self.view = moviePlayer.view;
-
P.332 11.1.4 プロパティーリストの読み込み 下から9行目
誤 NSString path = [NSString stringWithFormat: @"%@/Library/Preferences/bookmarks.plist", NSHomeDirectory()]; ↓ 正 NSString *path = [NSString stringWithFormat: @"%@/Library/Preferences/bookmarks.plist", NSHomeDirectory()];
-
P.314 10.10.1 デバイスの向きを読み出す 下から4行目(2011年8月25日)
誤 UIAccelerometer = [UIAccelerometer sharedAccelerometer]; ↓ 正 UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];
あと、仕様変更なのか誤植か判断できませんが、
P.316 10.10.3 加速度センサーの読み出しUIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer]; UIAccelerationValue x = acceleration.x; UIAccelerationValue y = acceleration.y; UIAccelerationValue z = acceleration.z; UIAccelerometerにプロパティx,y,zはなく、加速度を直接取得できません。 ちなみにデリゲートを用いた場合の加速度変化メソッド -(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration; にて、UIAccelerationにはx,y,zのプロパティはあります。
-
P.288
10.5.2 UIImageView- ビュー付きの画像(8月23日)
誤 NSMutableArray *myImages =[[NSMutableArray alloc]init]; [myImages addItem:myImage1]; [myImages addItem:myImage2]; [myImages addItem:myImage3]; ↓ 正 NSMutableArray *myImages =[[NSMutableArray alloc]init]; [myImages addObject:myImage1]; [myImages addObject:myImage2]; [myImages addObject:myImage3]; 誤 imageView.repeatCount = 5.0; // 5秒 ↓ 正 imageView.animationRepeatCount = 5.0; // 5秒
-
P.285 10.5.1.9 画像の向き(2011年8月21日)
imageOrientationプロパティはReadOnly属性のため、 myImage.imageOrientation = UIImageOrientationUp; といった直接代入はできません。
-
P.274 6,7行目(8月11日)
誤 [viewController release]; [viewController release]; ↓ 正 [navigationController release]; [viewController release];
P.277 8行目誤 if([cell.text isEqualToString: [[activeSections objectAtIndex:[indexPath indexAtPosition:0]] objectAtIndex:i]]){ ↓ 正 if([cell.textLabel.text isEqualToString: [[activeSections objectAtIndex:[indexPath indexAtPosition:0]] objectAtIndex:i]]){
※iOS3.0からはcell.textはDeprecatedであり、SDKの仕様変更が原因と考えられるものの、 書籍ではP.277の-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
にて、cell.textLabel.textを使用していることから、 プログラミングの記述ミス(少なくとも表記の不統一ミス)である可能性が高い -
P.262 の最後の行
誤 [navigationController pushViewController:viewController.view animated:YES]; ↓ 正 [navigationController pushViewController:viewController animated:YES];
-
P.260~P.261 にかけてのプログラム
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath のプログラムが2つ載っている -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // 作例では何の説明も無くfileListを使用している。 // 下記のようにindexPathからCellIdentifierを取得すべきでは? NSString *CellIdentifier = [NSString stringWithFormat:@"%d:%d", [indexPath indexAtPosition:0], [indexPath indexAtPosition:1]]; UITableViewCell *cell = [[tableView dequeueReusableCellWithIdentifier:CellIdentifier] retain]; // retainが必要(ここでも抜けている) if(cell==nil){
-
P.255 10.1.7.1 ページコントロールのの生成(2011年8月9日)
iOSの仕様変更かもしれませんが、iOS4にて pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(0.0, 350.0, 320.0, 0.0)]; とするとページコントロールが反応しません。そこで、 pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(0.0, 350.0, 320.0, 30.0)]; とし、ページコントロールにwidth値を持たせてやると反応するようです。
-
P.2533行目(8月8日)
誤 CGRect *startButtonFrame = CGRectMake(25, 25, 100, 100); ↓ 正 CGRect startButtonFrame = CGRectMake(25, 25, 100, 100); ※CGRectMakeの戻りはCGRect型
10行目、18行目誤 applicationImageNamed ↓ 正 imageNamed
-
P.245 7行目、8行目(8月7日)
applicationImageNamed → imageNamed -
P.248 真ん中あたり
bounds.size.x → bounds.size.width
bounds.size.y → bounds.size.height
-
P.241 11行目
誤 [segmentedControl setImage:[UIImage applicationImageNamed:@"unicorns.png"] forSegmentAtIndex: 0]; ↓ 正 [segmentedControl setImage:[UIImage imageNamed:@"unicorns.png"] forSegmentAtIndex: 0];
誤植あるいは仕様の変更(すみません。未確認です。書籍のままではコンパイルエラーになります)。 -
P.240 下から10行目(2011年8月5日)
誤 UIImage *myBunnies =[UIImage applicationImageNamed:@"bunnies.png"]; ↓ 正 UIImage *myBunnies =[UIImage imageNamed:@"bunnies.png"];
-
P.239 6行目(8月5日)
誤 [self sendActionsForControlEvents:UIControlEventValueChanged]; ↓ 正 [myControl sendActionsForControlEvents:UIControlEventValueChanged]; selfだと書籍の読者はViewControllerかなにかと勘違いしてしまう。 P.238までの表記と合わせるなら上記のように変更すべき。
-
P.228 最後の行近辺のプログラム断片(8月4日)
誤 -(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { /* キャンセル処理の追加コード */ } ↓ 正 -(BOOL)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker { /* キャンセル処理の追加コード */ }
-
9.1.5.1 マルチバリューエントリーの書き込み
誤 ABMultiValueAddValueAndLabel(copyOfURLs, "http://www.oreilly.com", kABPersonHomePageLabel, NULL); ↓ 正 ABMultiValueAddValueAndLabel(copyOfURLs, @"http://www.oreilly.com", kABPersonHomePageLabel, NULL); ABMultiValueAddValueAndLabel関数の第2引数CFTypeRef valueは NSString型の文字列を渡さないと実行時エラーになる。
-
P.214
8.1.5 エラー処理
-(void)locationManager:(CLLocationManager *)locationManager didFailWithError:(NSError *)error誤 NSLog(@"Core Location --エラーで失敗: %@ ", [error code]); ↓ 正 NSLog(@"Core Location --エラーで失敗: %d ", [error code]);
[error code]はNSIntegerを返すため、%@で受けると実行時エラーになる -
7.2.1 CFHTTP
makeRequest関数
誤 CFReadStream readStream; ↓ 正 CFReadStreamRef readStream;
-
7.2.1 CFHTTP
makeRequest関数。
書籍記述のプログラムをコンパイルする(Xcode3.2.6)と、エラーが出る。
NSURL url = [NSURL URLWithString:requestURLString]; // Variable-size object may not be initializedエラー // Statically allocated instance of Objective-C class 'NSURL'エラー : request = CFHTTPMessageCreateRequest( kCFAllocatorDefault, CFSTR("GET"), (CFURLRef)url, // Cannot Convert to pointer typeエラー kCFHTTPVersion1_1);
↓CFURLRefならあらかじめ文字列長が決まっていなくても問題ないようなので、 下記のようにすればコンパイルエラーは消える CFURLRef url = (CFURLRef)[NSURL URLWithString:requestURLString]; : request = CFHTTPMessageCreateRequest( kCFAllocatorDefault, CFSTR("GET"), url, kCFHTTPVersion1_1);
-
7.1.2.1新しいソケットの作成にて、
CFSocketCreate関数の引数の説明がつづくが、一番最後に説明が提示されている、
CFTimeInterval timeout
という引数はCFSocketCreate関数に存在しない -
p165下から4行目では
「例6-8から例6-10の例では、sample.wavというサウンドファイル~」とある。
例6-9 SoundExampleAppDelegate.m 誤 NSURL *url = [NSURL fileURLWithPath:[bundle pathForResource:@"sound" ofType: @"aif"]]; ↓ 正 NSURL *url = [NSURL fileURLWithPath:[bundle pathForResource:@"sample" ofType: @"wav"]];
-
P.155 最初のplayer作成例
誤 AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL filedURLWithPath: [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"m4a" inDirectory:@"/"]] error: &err] ↓ 正 AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"m4a" inDirectory:@"/"]] error: &err];
- filedURLWithPathではなくfileURLWithPath
- 文末の「;」がありません。
-
P.146 2行目以降
次の例ではレイヤをちょうど360度回転させるアニメーションを作成しています。 animation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(3.1415, 0, 0, 1.0)]; とあるが、360度は2πなので、前述の説明文が正しいとすると CATransform3DMakeRotationの1項目(angle)は3.1415*2では? ただし、360度回転ということになると画像的には元に戻ってしまうので、 効果がわかりにくく、解説事例として不適当であるため、 本来の説明文の趣旨としては 「次の例ではレイヤをちょうど180度回転させるアニメーションを作成しています。」 というのが正解ではなかろうか?(それならプログラムの内容と一致する)
-
P.127~P.128
4.1.3.2 辺と中心の座標の取得 CGRectGetMinY 誤 矩形の下辺のy座標を返します ↓ 正 矩形の上辺のy座標を返します ディスプレイの原点座標(0,0)が左上であり(P.126参照)、MinYを求めているわけだから、 「矩形の上辺」のY座標が適切。同様に CGRectGetMaxY 誤 矩形の上辺のy座標を返します ↓ 正 矩形の下辺のy座標を返します
-
P.149 initメソッド内
誤 image1.layer.position = CGPointMake((image.size.width/2)+1, (image.size.width/2)+1); : image2.layer.position = CGPointMake((image.size.width/2)+1, (image.size.width/2)+1); ↓ 正 image1.layer.position = CGPointMake((image.size.width/2)+1, (image.size.height/2)+1); : image2.layer.position = CGPointMake((image.size.width/2)+1, (image.size.height/2)+1); たまたまサンプルで使っている画像が正方形のため問題になっていないが 本来、CGPointMakeの第二項ではimage.size.hightを参照すべき
-
p.93(3.6.3 FlipDemo)
RootViewController.m setPage内 誤: myTransition.timingFunction =UIViewAnimationCurveEaseInOut; ↓ 正: myTransition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; またRootViewController.mに下記が必要 #import <QuartzCore/CAMediaTimingFunction.h>
-
P.99 3.7.2アクションシート
最後の行(「Toolbar」が正しい) 誤: [mySheet showFromToolBar:toolbar]; 正: [mySheet showFromToolbar:toolbar];
ご参考
読者の方が困った(はまった)箇所だそうです。ご参考までに。
-
9.1.5 複数値を持つプロパティ
特に説明がなかったので、 ABMultiValueCopyLabelAtIndex関数からの返り値(CFStringRef) と 各種ラベル(ex.kABWorkLabel) を下記のように単純比較できるかと思いましたが、 CFStringRef label = ABMultiValueCopyLabelAtIndex(emails, index); if(label==kABWorkLabel){ : 実際は CFStringRef label = ABMultiValueCopyLabelAtIndex(emails, index); if(CFStringCompare(label, kABWorkLabel,0)==0){ : のようにCFStringCompare関数を使って比較しないとダメなようです