ラベル Xcode の投稿を表示しています。 すべての投稿を表示
ラベル Xcode の投稿を表示しています。 すべての投稿を表示

2010年9月30日木曜日

クラス変数を扱う際にselfつけるか田舎、いや否か

はい、しょーもない出だしでした。

またクラスを定義して考えていくです(・ω・)ノ


<CVImageView.h>
 @interface CVImageView : UIView {
    UIView *menuView;
UILabel *label;
}

//ゲッター、セッター作るよー!という宣言
@property (nonatomic, retain)UIView *view;
@property (nonatomic, retain)UILable *label;
-(void)hoge;

@end

<CVImageView.m> 
@synthesize view;
@synthesize label;

-(void)viewDidLoad//ビルドして一番最初に呼ばれる関数
{
  //初期化
  self.label.text = @"hoge"; ー ①
  label.text = @"hoge"; ー②
}

-(void)hoge
{
/*viewDidLoadで説明しちゃうので略*/
}


さーて、①と②はどういう違いがあるのでしょうか。


(゚ε゚)えっと。。



正解は、
①はゲッター関数を経由して、クラス変数labelを初期化していて、②はゲッター関数を経由しないで初期化しています。

@property, @synthesizeを宣言するということはセッター関数とゲッター関数を自分で宣言せずにおまかせで作ってしまおうということでしたよね。

だから実は、この場合
-(UILabel *)label//getとは頭につけないのがobj-Cの習慣
{
     retrun label;
}
-(void)setlabel:(id)temp
{
   if(label != temp){
      [temp retain];
      [label release]
      label = temp;  
 }
}
が明示的には書かれないけど宣言されています。
だからself.labelとするとこの関数が呼ばれるんですねー。

これが気にいらない場合は@propertyはする一方で, @synthesizeを宣言をせずに、
自分でゲッター、セッター関数を定義するのも手ですね。

-(UILabel *)label
{
     retrun label;

}
実際これだとlabelのテキストが@"hoge"で初期化されてなくても(nilであっても)返ってきてしまうので、少し処理で困る事もあります。

というのは
[(中身がnilのインスタンス) 関数];とコードを書いても、ビルドは通るのですね。
しかし、中身がnilなので、関数は実行されずに無視されてしまうという罠。

だから、ビルドが通ってエラーが出なくても、そこの処理が行われないっていうことも起こりえます。

ここで、より確実に初期化でnilでは無いものを入れて、nilが返ってこないようにするには、 @synthesizeを宣言をせずに、自分で設定してしまいます。

ゲッター関数は以下のように定義します。

-(UILabel *)label
{
   if(!label.text) { //if(A) : if A is not nil labelがnilのとき
        UILabel *tempLabel.text = @"hoge";
        self.label = tempLabel;
   }
   return label; //label.textがnilではない時
}

ってやっちゃえば、確実にtextがnilじゃないものが返ってきますお!!

lib**.aファイルの参照

相変わらずsimulatorでテストしようとしても、以下のようなエラーが出るのでそれは放置。





これもいつかは直さないとな。。

ってことで、今回はあくまで実機向けのライブラリファイルへのリンク。

このdevice_libはどこから読みこんでいるんだ!っていうと、ここからです。



自分のいま作業を行っているプロジェクト内にあるopencv_deviceディレクトリ内にある、lib**.aを参照しています。これを参照すると実機で動くようになりました。

 (追記メモ)
ちなみに、ここでOpenCV2.1のライブラリファイルを参照すると、
ld: library not found for - lcv 2.1.0
とエラーが出てしまい、実機でもシミュレータでもビルドできなくなる。

iOS4.1+XCode(ver.3.2.4)でOpenCV2.1を使用する

 基本的には以前の日記にも書いたniwa氏のサイトを参考にした。
http://niw.at/articles/2009/03/14/using-opencv-on-iphone/ja


しかし、ここだけでは自分の設定が悪いのか、環境が悪いのかどうにもこうにも
動かないことがあったので、メモ代わりにいくつか書いておく。
(間違いがれば、随時訂正します。)

4.OpenCVにiOS SDK 4.xでビルドできるようにパッチを当ててください
% cd OpenCV-2.1.0
% patch -p1 < ../OpenCV-2.1.0.patch
 
とありますが、OpenCV-2.1.0.patchはniwa氏のサンプルをgitからダウンロードすると
そのディレクトリ内にあるので、それを自分の作業ディレクトリ内にコピー。
 
 
5.6. 実機向け、シミュレータむけのビルド〜
% ../opencv_cmake.sh Simulator ../OpenCV-2.1.0 とありますが、ここでも 
opencv_cmake.shを同様にコピーして使用する。
 
ここで、niwa氏のblogのコメント欄にも書いてあるが(残念ながら英語)、
 
AMさんのコメント 09/15, 2010

Thanks so much for your work and support on this project.

I'm
 running into a build issue and I wonder if you can help. Everything is 
fine until I'm at the building static Device library phase 
(../opencv_cmake.sh Device ../OpenCV-2.1.0
) and I get the error

'iOS SDK Version 4.0 is not found, please select iOS version you have'

-- I'm running XCode 3.2.4 with iOS 4.1 on Mac 10.6.4 -- (OpenCV 2.1.0 obviously).

Am I doing something wrong? 
Thanks again for your help. 
 
iOS4.1ではエラーが出てしまうのだ。実際自分も同じエラーが出て困った。
 
そこで、opencv_cmake.shをテキストエディタで開き、
 
4行目、24行目SDK VERSIONが4.0で指定されているところを手動で4.1に変えてしまう。
(念のため元ファイルはコピーしてバックアップしておきましょう。) 
 
 
 
こうすると上記のエラーが無くなり、ビルドは問題なく実行される。
さて、次に行きますか。
 
(しかし、書いてはいるものの、正解かどうかは自信が無いのであしからず。。。
やる時は自己責任でお願いします(>_<) )
 
プロジェクト”your_project”の情報→ビルドタブを見ます。
 
ここのヘッダ検索パスにもし、/usr/loacl/includeが含まれていればそれを削除。
 
次にターゲット ”your_project”の情報→ビルドを見ます。
 
 
ここで、 アクティブアーキテクチャのみをビルドにチェックを入れる。
さらに、他のリンカフラグに -lstdc++, -lz を追加する。
 
 
さー、あともうちょい頑張って書くぞっと( ゚Д゚)
 
このターゲットの情報、ビルドのタブの中から次に、検索パスを探す。


 ここで、以下のように設定する。


左下にあるこの設定プルからビルド設定条件を追加を選択して以下を足す。
 ※niwaさんのプロジェクト参照

ヘッダ検索パス
Any iOS Device Any Architecture $(SRCROOT)/opencv_device/include
Any iOS Simulator Any Architecture$(SRCROOT)/opencv_simulator/include

ライブラリ検索パス
$(inherited)
$(SRCROOT)/opencv_device/lib
Any iOS Device Any Architecture$(SRCROOT)/opencv_device/lib
Any iOS Simulator Any Architecture$(SRCROOT)/opencv_simulator/lib

そして、最後に、左上の構成プルダウンから、アクティブ(Debug)を選択してひとまず終了。


これでこの回はとりあえず終了して、次回に期待。

( ゚Д゚)<おい待て

2010年9月15日水曜日

Xcodeの便利な機能

よく使用方法が分からないクラス、サブクラスのことを知りたいときはそのクラスまたはサブクラスをダブルクリックして選択する。

そして、右クリックでこのようなウインドウがでる。



ここで、定義へジャンプすると。


必要な関数や、その中に使われている変数などの説明や一覧を見る事ができる。
@optionalとなっているものは書いてもよいし、書かなくてもよい。必要に応じて利用する。

また、__OSX_AVAILABLE_BUT_DEPRECATEDと書かれているものはサポートが終わるものを示しているのでなるべく使わない。

以下の例で見てみる。



ここでは、一番上の選択されているものがサポートが終わるものである。
これをダブルクリックして、”テキストをドキュメント内から検索”を選択すると、このような画面がでて、選択した関数に変わってこれがいいよ。という情報ももらえる。


従って、訳が分からんようになってしまったら見てみる癖をつけたい。