Objcetive-cの基本的なこと、わかっていなかったので改めて学ぶ と反省

初心者レベルの言い訳をしない:柴田 芳樹 (Yoshiki Shibata):So-netブログ
http://yshibata.blog.so-net.ne.jp/2013-09-11

ここの記事見て改めて反省。
プログラマじゃもうないけど、全部のことに言えそうなので反省

出来上がったコードの可読性も含めた品質の悪さを、短納期だったとかプロトタイプだから言い訳する人がいます。スキルが高い人の場合は、同じ時間制約でも高い品質のコードを書きます。それは、ある程度無意識になるまで、訓練を重ねているからです。無意識になるまで意識して普段から活動するのです。

何も考えず汚いのを垂れ流しです。あげくつまづいている。
綺麗なコードを書く人だったり、丁寧な仕事をする人は普段から違うのだと痛感。

で、Objective-Cのことがこの記事ですごくまとまって書いてあります。

github上の「はてな教科書」に、iOSアプリ開発など新規のテキストを追加しました
http://developer.hatenastaff.com/entry/2013/09/12/181712

のweb-apiを利用するWeb API を利用する iOS アプリ作成の部分

Hatena-Textbook/ios-app-development-with-web-api.md at master · hatena/Hatena-Textbook
https://github.com/hatena/Hatena-Textbook/blob/master/ios-app-development-with-web-api.md

id型の視点がすっかり抜けてたりしてます。

まだ3分の1くらい読んだだけど、
文法の記述はわかると思いたいです・・・けど汚いので改めて復習して追記。

続き

Toll Free Bridgeの概念も初めて知りました。

(NSStringは知ってましたが、CFStringRefは知りませんでした
 CFはCoreFoundationの略でOS X用のクラスなんですね。__bridge でキャスト可能と。)

参考記事
Toll-free bridge の実現方法 Toll-free bridge とは?
http://hmdt.jp/core/base/bridge.html

あと比較の時、数値などは==、文字列などは比較の為のメソッドを使うと
ほぼ暗記に近かったのですが

== はポインタ値の比較になります。オブジェクトの値の比較には isEqual: とか isEqualToXXX: を使いましょう。文字列リテラルのポインタ値の比較は内部実装に依存するため未定義です。ほとんどの場合で isEqual: を使います。

で違いを再認識。int型などはオブジェクトではないのでポインタ値の変換で大丈夫。
NSString,NSInteger型はオブジェクトなので値の比較はisEqual系を使わないといけないのかな。

クラスメソッド、インスタンスメソッド

// インスタンスメソッド

  • (返り値の型)methodNameWithFirstArgument:(引数の型)引数の名前 secondArgument:(引数の型)引数の名前;

// クラスメソッド

  1. (返り値の型)methodNameWithArgument:(引数の型)引数の名前;

今までインスタンスメソッドしか記述してなかったので両方の違いなんて全然・・。
改めて復習。

インスタンスメソッド(定義冒頭[-]のメソッド)はインスタンス生成して初めて利用出来る。
インスタンス生成→インスタンスメソッド

クラスメソッド(定義冒頭[+]のメソッド)はインスタンス生成しなくても利用出来る。
[SampleClass sample:test]のようにいきなり呼んでも大丈夫。

両者の使い分けは
参考記事
Objective-C 基礎(5)- クラスメソッドとインスタンスメソッド
http://white-bear.info/archives/116

クラスメソッドは、インスタンスを生成せずにクラスから直接使用するので、インスタンスメソッドとは異なる性質を持っています。インスタンスを生成していないので、インスタンス変数、インスタンスメソッドを使うことはできません。

ということからクラスメソッドは汎用性が高いメソッドとなるのが普通で、渡される引数の値などだけで処理が完了するようなカンジになります。単純な計算処理や初期化処理などはクラスメソッドとして実装することができると思います。

とあるようにインスタンス生成する時のallocがクラスメソッドだったのだとようやく理解。(コンビニエンスコンストラクタも名前だけで使用してなかったので書き換えるようにissueとして記述しておこう)


プロパティの属性

atomic, nonatomic
atomic は複数のスレッドから触るときに排他制御してくれる。デフォルト
nonatomic はそういうことしない代わりにパフォーマンスが良い
readwrite, readonly
readwrite は読み書きできる。getter と setter が生成される。デフォルト
readonly は読み込み専用。getter しか生成されない
strong, weak
strong は強参照。デフォルト
weak は弱参照

これも何気なくatomic,storongとか記述していて、
分からずに使っているのは怖いことだなぁと反省しまくりです。

○block
一時的な関数を記述出来る構文みたいなのですが、いまいち使用するべき箇所がよくわからない・・・orz

参考記事
逆引きObjective-C for iPhoneアプリ - ブロック構文の基本的な使い方
http://www.objectivec-iphone.com/introduction/block/block.html

処理を色々追加したり分けていくのに使うもの・・・?

長くなりそうなので文法等のところまで。
以降はアーキテクチャの部分はまた違うところに書く。

調べにいったところでよく

詳解 Objective-C 2.0 第3版

詳解 Objective-C 2.0 第3版

この書籍がお勧めされていました。
昨年のいつかに買って以来、途中で挫折して読まずに積んでありますorz
改めて少しでも読みすすめていこうと思いました。