1read 100read
2011年11月2期新・mac3: [SDK]iPhoneアプリ開発初心者質問箱20[touch][iPad] (112)
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▼
[SDK]iPhoneアプリ開発初心者質問箱20[touch][iPad]
1 :名称未設定 :2011/11/21(月) 17:52:08.46 ID:aPXxhH9/0 〜 最終レス :名称未設定 :2011/11/24(木) 18:15:18.25 ID:7rwloyFt0 iPhone, iPod touch用アプリケーションの開発を始めたばかりの初心者向け質問スレ。 ■質問する前に■ 1. 質問は日本語もしくはObjective-Cで 2. どういう内容であれレスをもらったら報告とお礼の言葉を忘れずに。 回答者は自分の時間を使って親切で回答してくれています。 3. 回答者は自分も初心者であった事を忘れずに。 4. マルチポスト(複数のスレに同じ質問を書込むこと)は厳禁! 5. 質問は可能な限り具体的に。 ただ「エラーが出ます」ではエスパーかスタンド使いでなければ答えられません。 エラー内容をちゃんと書きましょう。 6. わからない部分のコードをコピペすると手っ取り早いです。 7. このスレは無料プログラミング教室ではありません。 「○○の仕方を教えてください」という質問はなるべく避けてください。 「自分で調べたけどわからなかった事」を質問するというスタンスを忘れずに。 8. バグを安易にOSや開発環境のせいにしない。 自分の知識の無さを棚に上げて人のせいにするなんて百年早い。 ■前スレ [SDK]iPhoneアプリ開発初心者質問箱19[touch][iPad] http://hibari.2ch.net/test/read.cgi/mac/1319285523/ ■本スレ iPod touch/iPhone ネイティブアプリ製作 ver.16 http://hibari.2ch.net/test/read.cgi/mac/1312723856/
2 : ■参考書籍 【入門書】 電子書籍「iOSの教科書」(ウック/パブー 2011/07、iOS 5/Xcode 4.2暫定対応版)赤松正行、神谷典孝 iPhone/iPad/iPod touchプログラミングル―iOS 5/Xcode 4対応(ソシム 2011-11)布留川英一 よくわかるiPhoneアプリ開発の教科書【Xcode 4対応版】(毎日コミュニケーションズ 2011-07)森巧尚 iOSプログラミング入門 - Objective-C + Xcode 4で学ぶ、iOSアプリ開発の基礎(ビー・エヌ・エヌ新社 2011-06)大津真 【Objective-C/Xcode】 世界一わかりやすいObjective‐Cプログラミングの授業(ソシム 2011-01)Lepton 詳解 Objective-C 2.0 改訂版(ソフトバンククリエイティブ 2010-12)荻原剛志 エキスパートObjective-Cプログラミング(インプレスジャパン/達人出版会 2011-11)坂本一樹 Xcode 4 入門 for iOS/Mac OS X(秀和システム 2011/09)柴田文彦 【中・上級】 iPhoneアプリ設計の極意―思わずタップしたくなるアプリのデザイン(オライリージャパン 2011-06)Josh Clark iPhoneプログラミングUIKit詳解リファレンス(リックテレコム 2010-01)所友太 iOS4プログラミングブック(インプレスジャパン 2011-01)畑圭輔ほか iOS開発におけるパターンによるオートマティズム(ビー・エヌ・エヌ新社 2011-02)木下誠 iOSデバッグ&最適化技法 for iPad/iPhone(秀和システム 2010-11)國居貴浩 【テーマ別】 cocos2dで作る iPhone&iPadゲームプログラミング(インプレスジャパン 2011-06)Steffen Itterheim Unityによる3Dゲーム開発入門(オライリージャパン 2011-09)宮川義之、武藤太輔 iPhoneデジカメプログラミング(ソフトバンククリエイティブ 2011-03)細谷日出海 iPhone Core Audioプログラミング(ソフトバンククリエイティブ 2009-11)永野哲久 ■他 iOS Reference Library (日本語Webドキュメント) http://developer.apple.com/jp/devcenter/ios/library/japanese.html App StoreへのiPhoneアプリの登録手順のまとめ(Xcode4環境) http://www.facebook.com/note.php?note_id=153450554720309
3 : ARCはdealloc呼ばれますか?
4 : touchesBeganメソッドで、ピンチイン・ピンチアウトを実装したいので、if ([touches count] == 2) として ダブルタップのときのみ処理を実行するようにしているのですが、 本当にぴったり同時にタッチしなければ[touches count]は2にならず、 ほとんどの場合、普通のタップが2回起こっただけという結果になってしまいます。 多少ずれてもダブルタップと認識させるにはどのように工夫すればよいのでしょうか。
5 : それを自分で考るのがプログラミングなのでは?
6 : そういうのはいいんで。
7 : 気合と根性と愛だろjk
8 : >>4 一回も調べてないだろ。 UIGestureRecognizerにある。 ちょっとググれば色々出て来るぞ。
9 : >>8 一応調べましたがUIGestureRecognizerだと細かい操作ができなくないですか。 各タッチの座標によって処理を変えるなど細かいことをしたいんです。
10 : 自作する方法もどっかに出てたぞ。 二つのタップの時間的間隔をタイマーで判定するとか、そんな事だよ。
11 : 調べてみます。 どうもありがとうございます。
12 : 質問です。次の3つは、どう使い分けたら良いのでしょうか? (1)NSMutableString *sample; (2)NSMutableString *sample = [NSMutableString alloc]; (3)NSMutableString *sample = [[NSMutableString alloc] init];
13 : (1) NSMutableString型のポインタ変数 sample を宣言。 (2) NSMutableStringオブジェクトを生成し、そのポインタを変数sampleを宣言して代入。 (3) NSMutableStringオブジェクトを生成し、インスタンスメソッドinitで初期化、 そのポインタを変数sampleを宣言して代入。
14 : >>12 (1) はポインタを宣言するだけ。別途代入が必要。 (3) はポインタを宣言すると同時に NSMutableString を生成して代入。 たまに NSMutableString *str = [[NSMutableString alloc] init]; str = [NSMutableString stringWithFormat:...]; みたいに無駄な初期化をしてるコードを見かけるけど、無駄なのでやめましょう。 (2) は、Objective-C では alloc と init は組み合わせて使う必要があり、 alloc だけを書くのはお勧めできません。
15 : >>11 もう聞きに来ないでね。
16 : >>14 >たまに >NSMutableString *str = [[NSMutableString alloc] init]; >str = [NSMutableString stringWithFormat:...]; >みたいに無駄な初期化をしてるコードを見かける 無駄どころか、ARC無効ならメモリリークするよね
17 : >>15 何がそんなに悔しかった?
18 : >>3 呼ばれる。dealloc の書き方は、ARC の場合、 ・[super dealloc] やインスタンス変数の release は自動生成されるので、不要。 ・なので、通常は dealloc 自体書く必要ないが、資源の解放が必要ならそれだけ書けばいい。 ということになった筈。
19 : 以下のコードにおいて ゲッターのgetGlobalClassesの引数はNSMutableArrayでなければならないと思うのですが getGlobalClassesの引数がvoidで動いているのはなぜでしょうか @interface CalcAppDelegate : NSObject <UIApplicationDelegate> { NSMutableArray *globalClasses; } @property (nonatomic,retain) NSMutableArray *globalClasses; -(void) getGlobalClasses; -(void) getGlobalClasses{ if (globalClasses!=nil) { return globalClasses; } NSMutableArray *newArray=[[NSMutableArray alloc] initWithCapacity:1]; self.globalClasses=newArray; [newArray release]; return globalClasses; }
20 : みんなスマートポインタとかATLとかの世代じゃないのね・・・
21 : >>4 自分は、状態を表すフラグを用意して、 touchesBegin NSSet *allTouches = [event touchesForView:self]; として、 [allTouches count] == 1 ならフラグを 1 に、2 ならフラグを 2 にする。 また、座標を記録。 touchesMoved フラグが 1 または 2 かつ、動いた距離が小さければ無視。 フラグが 1 または 2 かつ、動いた距離が大きければフラグをドラッグ中に。 フラグに応じて、1 本指または 2 本指でのドラッグ処理。 みたいなことをしてる。実際はもっと複雑。
22 : >>17 自分で何も考えられないクズがえらそうなのが許せなかったんだろw
23 : >>19 引数? 戻り値じゃなくて? 戻り値 void のメソッドで return 値; すると ・llvm gcc 4.2 は警告 ・llvm clang 3.0 はエラー だね。びっくり。 あと、Objective-C のメソッド名の命名規則では、普通のゲッターは get を付けないよ。
24 : >>22 芽のでない種に水をやるのがバカらしいだけ
25 : >>21 なるほど。 某ブログではタッチを全てNSMutableArrayにぶち込み、countで数を取得して2個だった時のみ処理を実行するというやり方が載ってました。 >>24 あんたに何か教わった覚えはありませんが。 なんでここの連中ってこんなに偉そうなんだろ? 教師にでもなったつもりなのかな?
26 : ここは教師が生徒に無料で指南するスレですが何か。
27 : じゃあ素直に教えたらいいんじゃないかな。 「それを自分で考るのがプログラミングなのでは?」 なんて無駄な書き込みしないでさ。
28 : >>25 そのブログが何をしているのかしらないが、ドキュメントにはこうある。 「UITouchは絶対にretainするな。もしタッチの情報をとっておきたい場合は、UITouchから情報を取得し、その情報をとっておくこと」 とある。
29 : 調べたが分からなかったところを教えて ↓ 素直に教えてあげる 考えるのめんどくさいんで教えて ↓ それを自分で考るのがプログラミングなのでは
30 : なんか考え方が古いというか時代に合ってませんよね 昭和の人ですか?
31 : お前は質問する前にスルー力を鍛えろ。
32 : あと、実際にやれば分かるけど、画面から指が離れても touchesEnded: withEvent: が呼ばれない場合が多々あるので、touchesBeganで 「タッチを全てNSMutableArrayにぶち込み」 toucehsEnded(またはtouchesCancelled)でNSMutableArrayから取り除いても、 [array count] は現在画面をタッチしている指の数とは一致しない。
33 : 教えないならスルーしろとか思ってたが、さすがにウザイわ NGID:Ho5OluGV0
34 : >>25 もう来ないでね
35 : >>32 じゃあどうすればいいのよ CFDictionaryを使えばいいの?
36 : >>30 自分で何も調べなくても親切な人が教えてくれるのが時代に合った考え方か。 ゆとり世代って致命的に使えない連中だな。 >>35 ママに聞け
37 : >>32 touchesEnded が呼ばれない場合があるってのはマジ? 自分は経験ないんだけど。 ってか、touchesEnded が呼ばれないとドラッグ処理の終わりが検出できない…。 [touches count] が当てにならないってこと?
38 : >>35 この程度の問題を自分で解決できないやつが 恥ずかし気も無く上から目線で質問するとか。 お前の両親、朝鮮人だろ?
39 : まあ、金貰って教える訳じゃないからこそ、 教わる側の姿勢は大事なんだがな。 そんなことより、一つ教えてください。 UIView *v; IBでViewに結び付け UIImagePickerController *c; c = [[UIImagePickerController alloc] init]; c.sourceType = UIImagePickerControllerSourceTypeCamera; c.allowsEditing = NO; c.showsCameraControls = NO; c.cameraOverlayView.userInteractionEnabled = NO; [v addSubview:c.view]; こうするとvに、iOS5はカメラモードが表示されるんだけど、 iOS4.0だとタイトルバーだけが表示されるんだけど、 モジュールの仕様ですか?
40 : >>36 ばいばい http://www.dotup.org/uploda/www.dotup.org2292894.png >>38 日本人は人の両親を貶したりしませんよ。
41 : >>37 指を動かしている最中(touchedMoved: の中とか)に重い処理をさせたりして プロセスが混んでいる状態だと、呼ばれない場合が増える。 シミュレータでは(処理速度が速いので)起きない。
42 : Ho5OluGV0の母ですが、うちの息子が何か?<`∀´>
43 : >>41 なるほどー。ありがとうございます。 対策は、重い処理は裏に回すとか、touchesBegan で前回のドラッグの後始末をするとかですかね。
44 : >>13 >>14 >>16 レスありがとうございます。 下記の(1)は間違いなのでしょうか?間違いでなければ(2)と何が違うのでしょうか? (1)NSMutableString *sample; [sample setString:@"ほげ"]; (2)NSMutableString *sample = [[NSMutableString alloc] init]; [sample setString:@"ほげ"];
45 : (1)の方は何も起こらないんじゃね?
46 : >>44 (1)は=nilで初期化されるから確保されてないわけで何も出来ない
47 : >>44 [sample setString:@"ほげ"]; ってのは、sample というポインタが指してる先にあるオブジェクトに対して、setString: というメッセージを送っている。 (2) では sample は [[NSMutableString alloc] init] として作った NSMutableString オブジェクトを指してるけど、 (1) では sample はまだ何も指してない。 細かいことを言うと、ARC なら sample は nil (何のオブジェクトも指してないことを表す特別な値) で初期化されるので、本当に「何も指してない」ことが保証される。 で、Objective-C では nil にメッセージを送っても無視されることになってるので、何も起こらない。 ARC でなければ、sample は (ローカル変数なら) ゴミが入ってるので、ゴミに対してメッセージを送ることになり、 何が起こるか分からない。その場でクラッシュする場合もあるし、後で変なことが起こる可能性もある。 この調子でひとつひとつ質問するのはお互いに効率が悪いんで、Objective-C の入門書を読んで基本を理解することをお勧めするよ。
48 : あの、 ARCが有効でも @autoreleaseブロックって必要なのでしょうか? 普通のブロックでもブロック抜ければ解放されると思うのですが、なんか違いますか?
49 : >>48 今まで NSAutoreleasePool が必要だった所には必要。書き方が変わるだけで、やることは一緒だからね。
50 : ARCの場合、確保されたものがretainなのかautoreleaseなのかどうやって判断するんだっけ?
51 : 判断する必要がない
52 : ARCが有効であれば、autreleaseされたオブジェクトは @autoreleaseブロック ではなく 普通のブロックでも、それを抜ければ解放されると思うのですが、そうではないのでしょうか?
53 : いやだから、for文なんかを使ってて大量のオブジェクトが発生し、 普通のブロックを抜ける前にメモリ解放したほうが良い場合に使うの。 ARCのない従来のコーディングでもそういう場面はあり、従来はautoreleasepoolを自分で記述した。
54 : ループ内だったらautoreleasepoolにためるより手でreleaseした方が良くね?
55 : >>54 自分でallocしてないものにreleaseなんかすんなよ?
56 : >>53 threadも同じ?
57 : for文なんかで大量オブジェクトなんかはそうでしょうけど、 単にコンビニエンスコンストラクタ使って NSDate *date = [NSDate dateWithNaturalLanguageString:@"11/12/11"]; NSLog(@"%@", date); とすると、@autoreleaseブロックで囲まないと実行時にこんな感じで怒られるんです。 objc[38396]: Object 0x100115a50 of class __NSCFCharacterSet autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
58 : >>52 ARC を有効にしても、 for (int i = 0; i < 10; i++) { NSString *str = [NSString stringWithFormat:@"i = %d", i]; } だと autorelease pool にたまる。[[NSString alloc] initWith...] ならたまらない。 >>57 普通は main 関数で @autoreleasepool してるし、イベント処理などの際に自動的に autorelease pool が作られるから、自分で @autoreleasepool を書く必要はあまりないけど、 マルチスレッド環境 (NSThread, GCD, performSelectorInBackground:withObject: など) では自分で @autoreleasepool を書く必要がある。
59 : >>45 >>46 >>47 レスありがとうございます。 よくわかりました。
60 : >>58 ARCが有効な場合 @autoreleasepool { for (int i = 0; i < 10; i++) { NSString *str = [NSString stringWithFormat:@"i = %d", i]; } } でも { for (int i = 0; i < 10; i++) { NSString *str = [NSString stringWithFormat:@"i = %d", i]; } } でも解放される気がするのですが間違ってますか?
61 : -(void)doSomethingA { for (int i = 0; i < 10; i++) { @autoreleasepool { NSString *str = [NSString stringWithFormat:@"i = %d", i]; } } } -(void)doSomethingB { for (int i = 0; i < 10; i++) { NSString *str = [NSString stringWithFormat:@"i = %d", i]; } } doSomethingAの場合、ループの繰り返し毎にstrはリリースされる doSomethingBの場合、全部のループが終わり、doSomethingBから抜けるまで (run loopから抜けるまで)strはリリースされない
62 : doSomethingCは,doSomethingAと同じですか? -(void)doSomethingC { for (int i = 0; i < 10; i++) { { NSString *str = [NSString stringWithFormat:@"i = %d", i]; } } }
63 : doSomethingAは実際にはこんな感じのコードに展開されるんじゃないの? for (int i = 0; i < 10; i++) { NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; NSString *str = [NSString stringWithFormat:@"i = %d", i]; [pool release]; }
64 : >>62 これがAと同じならもう誰も信じられない。旅に出る。
65 : 自分で作ったアプリってダウンロードしていいの?
66 : >>65 iPhoneが使えなくなっても良いのならやれば?
67 : >>65 普通はダウンロードして動作確認するだろ。有料ならコード使って。
68 : すみません。間違えました。 -(void)doSomethingC { for (int i = 0; i < 10; i++) { { NSString *str = [[NSString alloc]initWithFormat:@"i = %d", i]; } } } 聞きたいのは、ARCが有効な場合、普通のブロックを抜けると変数が解放されるのなら、コンビニエンスコンストラクタ +@autoreleaseブロックを使う必要があるなのはどうい時なのかということなのですが
69 : poolに積まれたオブジェクトを解放するのはpoolが解放されたときなのは arc環境下でも変わらない。 forループのなかに暗黙に専用poolが作られるわけじゃない。 あくまで { } ブロック内のフォーカスに縛られるのはstrというポインタだけ。 なので、コンビニエンスコンストラクタが作ったものはpoolに積まれるから poolの解放までため続けられる。つまりメモリ食いしやすい。 それを避けたいなら、forループのなかで専用poolを用意すればいい。 @autoreleasepool{ : } というのをループの中におくのはそう言う意味。
70 : >>68 ARC有効なら -(void)doSomethingC { for (int i = 0; i < 10; i++) { NSString *str = [[NSString alloc] initWithFormat:@"i = %d", i]; } } が下のように自動解釈されるんだと思うけど。 -(void)doSomethingC { for (int i = 0; i < 10; i++) { NSString *str = [[NSString alloc] initWithFormat:@"i = %d", i]; [str release]; } } そして下のときは >>69 のいうように@autoreleasepoolでリリースしないと、ループ内では溜まる一方。 >>63 のようには展開されないと思われ。 -(void)doSomethingA2 { for (int i = 0; i < 100000; i++) { @autoreleasepool{ NSString *str = [NSString stringWithFormat:@"i = %d", i]; } } }
71 : 難しい、以下のような理解でよいでしょうか? ・alloc + initで生成したオブジェクトはブロックを抜けると解放される { NSString *str = [[NSString alloc]initWithFormat:@"i = %d", i]; } ←解放 ・autoreleaseされたオブジェクトは普通のブロックでは解放されずに+@autoreleaseブロックで解放される @autoreleasepool { { NSString *str = [NSString stringWithFormat:@"i = %d", i]; } ←解放されない } ←解放される
72 : UITextView関連で、変な現象が起こってます。誰か教えてください。 TextViewを拡大後、タッチして再入力しようとすると、1行のサイズが勝手に広がってしまう現象です。 やりたいことは、ピンチアウトで拡大可能、かつ上下にスクロール可能 な簡単なテキストエディタ。 UIScrollView svの上に、UITextView tvをaddSubviewしてます。 tvの横幅は固定で300くらいにしています。 最初は、普通にtvにテキストを入力できます。長い文章を入れると、右端で折り返して、次の行の左から続きます。 いったん入力をやめた後に、再びタッチすると、その場所にカーソルが来て普通に入力を継続できます。 ここまでは普通のエディタと同じような感じです。 しかし、ピンチアプトで拡大後(当然、文字やTVの幅は広がります)、タッチすると、tvの1行の横幅が広がってしまい、さっき 折り返していたところでは折り返さず、文字列がtvの右端からさらに右にいっているらしく、見えません。 拡大前は、tvの1行に30文字入っていたが、拡大後、タッチして入力しよとすると、tvの1行に入る文字数が40くらいになり、tvの横スクロールが必要になってきます。なぜこうなるのでしょうか
73 : >>71 そもそも変数のスコープとメモリ解放のタイミングは違うんじゃ? 下のヤツは@autoreleasepoolがなければ、 メモリが解放されるのはそのメソッドから抜けるときだよね?
74 : >>71 それで合ってる。 >>73 落第。autorelease pool について勉強し直せ。
75 : NSAutoreleasePool の実装は多分こんな感じ。改行減らしたので、見づらくてごめん。 @interface NSAutoreleasePool : NSObject { NSAutoreleasePool *prevPool; NSMutableArray *array; // autorelease したものの所有権はこれに移る。 } @end @implementation NSAutoreleasePool static NSAutoreleasePool *currentPool = nil; // 実際はスレッドごとに存在。 + (NSAutoreleasePool *)currentPool { return currentPool; } - (id)init { if (self = [super init]) { array = [[NSMutableArray alloc] init]; prevPool = currentPool; currentPool = self; } return self; } - (void)addObject:(id)object { [array addObject:object]; } - (void)dealloc { currentPool = prevPool; [array release]; // autorelease されたものはここで解放される。 [super dealloc]; } @end @implementation NSObject (autorelease) - (id)autorelease { // currentPool が nil なら警告。 [[NSAutoreleasePool currentPool] addObject:self]; // 所有権を currentPool に移す。 [self release]; return self; } @end
76 : 5分で勇者が帰ってきたり1時間でなめこが育ったりするアプリがありますが、 あれはアプリがキルされても時間の計測が問題なくできるのはどういう仕組みなのでしょうか。
77 : >>76 再起動したときの時計見てるだけ
78 : 出来れば理屈的な話より経験則的な話が欲しいのですが ずっとIBやSBを使いながらアプリ作りの練習していたのですが試しにエンプティから書き始めてみたら 当たり前ですけどアプリ作りの理解が物凄く良くなりました。 しばらくゼロから書いていく予定ですがIBとSBを使っていくのにどんな良さがあるんでしょうか? それとも上級者になったらみんな切っていくモンなんでしょうか??
79 : ボタンやらのコントロールの配置を数値でやらんといかんのがバカバカしくて ポトペタでできたらどんなにいいかと思うのだが、 画面遷移やテーブルの場合どうなるのかとかまったく分からないので 仕方なくコードから全部やってる。
80 : あらかたIBでやってる。
81 : 静的なUIはIB 動的なUIはコード
82 : ARCで自前のコンビニエンスコンストラクタを作るときはどうするんだろう?
83 : >82 試してないけど・・・ autoreleaseをよぶコードだけメソッド分離してカテゴリにし、 -fno-objc-arcをつけておけばいいような?
84 : >>83 なるほど、しかしファイルを分割するとコードの見通しが悪くなるなあ・・・ 関数単位でARCを無効にできたっけ?
85 : >>82 + (id)foo { return [[Foo alloc] init]; }
86 : >>85 retainならわかるけどautoreleaseのときがね・・・
87 : ふと思いついたけど、コンビニエンスコンストラクタの引数として呼び出し元の autorelease poolを渡すことができれば、可能かもしれない。
88 : >>86 メソッド名に応じて自動的に __strong または __autoreleasing になるよ。 http://stackoverflow.com/questions/7517363/implementing-convenience-constructors-for-automatic-reference-counting [[Foo alloc] init] の値は __strong id。これに対して、foo の戻り値は __autoreleasing id なので、 return 時に自動的に retain および autorelease されます。ARC おそるべし。 >>87 ナンセンス。
89 : 間違い。「return 時に自動的に autorelease されます。」でした。
90 : >>88 おお、こんな法則があったのね。ありがとう!
91 : >>78 コードの方が挙動が分かり易いし、色々できるのですが、実際のレイアウトはIBは一目瞭然。 なので、emptyから始めるけど、レイアウト確認用のxibを追加してInspectorで数字見ながらコーディング。
92 : いわゆるダイアログの部分だけIB使ってるな。 他の部分は結局ラクできない。
93 : ARCを有効にすると + (id)xxx { return [[Foo alloc] init]; } ↑autoreleaseされたのが返る + (id)initWithXxx { return [[Foo alloc] init]; } ↑retainされたのが返る という理解であってるかな?
94 : 質問です。 アドレスブックのマルチバリュープロパティの識別子は、どうすれば読み込めるのでしょうか?
95 : >>93 両方retainされたのが帰るんじゃない?
96 : >>93 なぜにどっちもクラスメソッドになってんの?
97 : >>95 両方retainなのかー >>96 下のはコンビニエンスコンストラクタにしたかった・・・(initじゃ変だよね) 例が悪かったのでもう一度書くと、 ARCが有効のとき、Fooクラスに以下のメソッドがあるとして autoreleaseされたのが返るのはどれ? <1> + (id)foo { return [[Foo alloc] init]; } <2> + (id)xxx { return [[Foo alloc] init]; } <3> + (id)fooWithXxx { return [[Foo alloc] init]; }
98 : >>93 の理解で合ってる。>>95 は間違い。(init って名前は変だけど。) ARC では、メソッド名が alloc, copy, mutableCopy, new, init で始まる場合は retain されたものを返し、 それ以外は retain されてない (必要に応じて autorelease された) ものを返す。 >>97 <1> 〜 <3> はどれも autorelease されたものを返すよ。それで問題ないと思うけど。 どうしても retain されたものを返したければ、newFoo とか newFooWith:... かな。 (ちなみに、with は引数がある時に使う。)
99 : 訂正。 >>93 はどっちも autorelease されたものを返す。 init に関しては、特別扱い (retain されたものを返す) はインスタンスメソッドの場合だけ。 詳しくはこれに書いてある。 http://clang.llvm.org/docs/AutomaticReferenceCounting.html
100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▲