Category Archives: Objective-C

Objective-CでNSStringプロパティ実装

0
Filed under Objective-C, プログラミング言語
Tagged as , , , , ,

Objective-Cをなんとなく使い続けていたのですが、分かってるようであまり分かっていなかったのがプロパティ
retain/release/autorelease周りとの絡みもあってなんとなくやり過ごしていたのですが、ちょっと切羽詰ってきたので仕切りなおして勉強してみました。

NSStringを持つクラスでテスト

いろいろ調べた結果、とりあえず、下記のようなクラスStringContainerを定義しておけば問題なく使えるっぽいです。(問題見つけたら教えてください!)
まずは、定義ファイル。内部にNSString*のインスタンス変数を二つと、そのプロパティ宣言を行っています。
重要なポリシーは、propertyは内部でコピーする、ということ。下記のページを参考にしています。

1
2
3
4
5
6
7
8
9
10
11
12
13
//  StringContainer.h
#import <Foundation/Foundation.h>
 
@interface StringContainer : NSObject {
	NSString*	str0;
	NSString*	str1;
}
 
// コピーするので、渡すものはautoreleaseしておいてください.
@property (nonatomic,copy) NSString* str0;
@property (nonatomic,copy) NSString* str1;
 
@end

次に実装コードです。プロパティ設定のためのsynthesizeと、デストラクタを定義しています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//  StringContainer.m
#import "StringContainer.h"
 
@implementation StringContainer
 
@synthesize str0, str1;
 
-(void) dealloc{
	[super dealloc];
 
	[str0 release];
	[str1 release];
}
 
@end

そして、テストコード。str0とstr1では別の与え方をしてみました。

1
2
3
4
5
6
7
8
// Test.m
// 確保.
StringContainer* scTest;
scTest = [[StringContainer alloc] init];
 
// 各パラメータを設定.
scTest.str0	= [NSString stringWithFormat:@"Default 0[%d]",0];
scTest.str1	= [[[NSString alloc] initWithFormat:@"Changed 1[%d]",11] autorelease];

str0に渡す文字列は、stringWithFormatはクラスメソッドで生成。なので、そこで生成されたオブジェクトはそちらでAutoRelease Poolに入っているようなので、特にrelease/autoreleaseを行う必要はありません。むしろ、それをやると、retain countが0になったときに、二重にreleaseが呼ばれるので、問題となります。
str1に渡す文字列は、alloc, initで生成したもの。ここで生成しているので、ここでautoreleaseしています。代入後に即releaseしても問題有りませんが、ここでrelease/autoreleaseのどちらかを行っていないと、そのメモリは破棄されないので、リークしてしまいます。

これでOKのハズ!

一応、Instrumentsツールを使ってリークを調べたりもしたので、これで大丈夫だと思うのですが、認識に問題があったら誰か教えて欲しいです!!!
たったこれだけのことを自信持ってかけるようになるのに半日かかりました!
AutoRelease Poolというものの存在、クラスメソッドで定義したものがそちらで勝手にautoreleaseされているっぽい、ということ、それらをググって知ったので理解できたのですが、そうでなかったらなかなか辿り着けないのです。
ちなみに、NSArrayも同様な書き方でプロパティ実装できるはずです。


[AD]
↓この本、買いました!ウェブで連載されていたコラムの総集編とiPhone Hackコラムの書き下ろし。読み物として書かれているので、飽きずに読めてる!Objective-Cの実装部分まで踏み込んでいるので、ダイナミック言語としての面白さを知ることができるし、後半ではデザインパターンの実装の話にもなる。

Dynamic Objective-C

著者/訳者:木下 誠

出版社:ビー・エヌ・エヌ新社( 2009-03-27 )

定価:¥ 3,360

Amazon価格:¥ 3,360

単行本(ソフトカバー) ( 456 ページ )

ISBN-10 : 4861006414

ISBN-13 : 9784861006418



↓これも店頭で見ていい!と思って買いました。iPhoneプログラムのコネタ集なんだけど、一つ一つが過不足無く説明とコードが書かれていて、本当にすばらしい!版型もちょっと小さいので、鞄に入れて移動中に気になるところをちょっとずつ読むスタイルもオススメ。

iPhoneSDK開発のレシピ

著者/訳者:高山 恭介 広部 一弥 松浦 晃洋

出版社:秀和システム( 2010-03 )

定価:¥ 2,520

Amazon価格:¥ 2,520

単行本 ( 319 ページ )

ISBN-10 : 4798025798

ISBN-13 : 9784798025797


iPhoneのOSのバージョンで処理分岐するコード

1
Filed under iPhone, Objective-C
Tagged as , , , ,

iPhoneもOSがどんどん進化しつつあります。
最近ではiOSの発表がありましたが、まだみんながみんなiOS4にアップデートしたわけではないでしょう。
しかし、iOSでも開発者に取って魅力的なAPIが増えており、iOS4を使用している人にはその機能を満喫して欲しい!という思いがあれば、OSのバージョンによる処理分岐が必要になると思います。
というわけで、OSのバージョンに応じた処理を行えるようなコードを書いてみました。
バージョンを文字のまま処理していると、将来のバージョン変更時に問題が発生しうるので、数値に変換して処理しているところが特徴です。

iPhone OS のバージョンによる処理分岐コード

1
2
3
4
5
6
7
8
NSString* osversion   = [UIDevice currentDevice].systemVersion;    // @"2.1", @"3.1.2"
NSArray*  numVersion  = [osversion componentsSeparatedByString:@"."];    // 配列.
int       ver0        = [[numVersion objectAtIndex:0] intValue];
int       ver1        = [[numVersion objectAtIndex:1] intValue];
NSLog(@"check version -- [%d][%d]", ver0, ver1);
if( ver0 >= 4 ){
  NSLog(@"check version -- >= iOS4");
}
にほんブログ村 IT技術ブログ iPhoneアプリ開発へ

[AD]

↓気がついたらiPhone開発本がいろいろ出ていますね!この本は実装機能から逆引きできてかなり良さそう!

iPhoneSDK開発のレシピ

著者/訳者:高山 恭介 広部 一弥 松浦 晃洋

出版社:秀和システム( 2010-03 )

定価:¥ 2,520

Amazon価格:¥ 2,520

単行本 ( 319 ページ )

ISBN-10 : 4798025798

ISBN-13 : 9784798025797


↓iOS4を入れたiPhone用に欲しい!

Apple Wireless Keyboard (JIS) MC184J/A

Apple Wireless Keyboard (JIS) MC184J/A

定価:¥ 6,800

Amazon価格:¥ 8,800

カテゴリ:Personal Computers

発売日:2009-10-31


↓最近3年ぶりくらいに電動歯ブラシを買い直しました。うちはオムロン派。

OMRON オムロン音波式電動歯ブラシ MediClean HT-B457

OMRON オムロン音波式電動歯ブラシ MediClean HT-B457

定価:¥ 9,150

Amazon価格:¥ 5,500

カテゴリ:ホーム&キッチン

発売日:2008-12-01


Objective-Cでのプロパティ宣言と実装

0
Filed under Objective-C
Tagged as , ,

iPhoneアプリを開発していて、Objective-Cを普通に使っているのですが、慣れないコードを書こうとすると、作業が止まってしまうことが多い。
これは細かいところの言語仕様を完全に把握しているわけではないのが原因で、1日くらいiPhone SDK抜きでObjective-Cでいろいろクラスを書いてみて仕様をしっかり覚えればいい、というのは頭では分かっているのですが他の仕事でいろいろな言語を渡り歩いているのもあり、なかなか一度しっかりと勉強する時間が取れない。
で、そんな自分の為にすぐにコピペできるようにコードのメモです。

プロパティの書き方

というわけで、Objective-Cでのプロパティの書き方メモ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Hoge.h
@interface Hoge: NSObject{
  // 以下のように内部変数を作っておく。
  int testInt;
  int testInt2;
  NSString* testStr;
  int coreValue;
}
 
// プロパティ名を宣言.
@property (readwrite) int testInt; // 一番簡単なプロパティ宣言.
@property (readonly) int testInt2; // 読込み専用プロパティ宣言.
@property (copy, readwrite) NSString* testStr;
// getter, setterを指定するプロパティ宣言(setter関数名に":"がついているのに注意).
@property (readwrite, getter=getSomeValue, setter=setSomeValue:)  int someValue;
@end

hogehoge.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#import "Hoge.h"
@implementation Hoge
@synthesize testInt;
@synthesize testInt2;
@synthesize testStr;
 
// コンストラクタ.
- (id) init{
}
 
// getter, setter.
-(void)setSomeValue:(int)value{
  coreValue = value;
}
-(int)getSomeValue{
  return coreValue;
}
@end

参考サイト


[AD]

↓Objective-Cを詳細に知るにはこの本がいいかもしれない!「なか見!検索」で見てみると、リファレンスカウンタについても書かれているみたいだし。

詳解 Objective-C 2.0

著者/訳者:荻原 剛志

出版社:ソフトバンククリエイティブ( 2008-05-28 )

定価:¥ 4,410

大型本 ( 560 ページ )

ISBN-10 : 4797346809

ISBN-13 : 9784797346800


↓iPhone用ACアダプタで、ケーブル巻き取り式な上に、USBコネクタがあるのでさらにもうひとつ何か充電できるスグレモノ!

プロテック シェルアダプター USB搭載AC充電器 PS-IBK ブラック 【iPod各種/iPod nano 5G/iPhone 3G,3GS】

プロテック シェルアダプター USB搭載AC充電器 PS-IBK ブラック 【iPod各種/iPod nano 5G/iPhone 3G,3GS】

定価:¥ 2,480

Amazon価格:¥ 2,052

カテゴリ:エレクトロニクス


↓iPhone用USBコネクタでケーブル巻き取り式。カバンに一つ入れておくと良さげ。