読者です 読者をやめる 読者になる 読者になる

Objective-CのTips

よく必要そうになりそうな機能をまとめました。
覚えるまでのチートシートという感じで・・・。


文字列操作

NSString *str1 = @"あいうえお";

// 文字数
int len = [str1 length];

// 文字列連結
NSString *str2 = [str1 stringByAppendingString:@"かきくけこ"];


// 文字列を変更する場合
NSMutableString *str3 = [NSMutableString stringWithString:@"あいうえお"];


// 文字列をセット
[str3 setString:@"ABCDE"]


// 末尾に文字列を追加
[str3 appendString:@"さしすせそ"];


// 文字列比較
BOOL result = [str1 isEqualToString:str2];

配列の操作

// 配列の生成
NSArray *array = [NSArray arrayWithObjects:@"ab", @"cd", @"ef", nil];

// 要素数を取得
int arrCount = [array count];


// 要素を取り出す
id obj1 = [array objectAtIndex:2];
id obj2 = [array lastObject];
NSArray *array2 = [array subarrayWithRange:NSMakeRange(1, 3)];


// 配列自体を変更する場合
NSMutableArray *mArray = [NSMutableArray array];
NSArray *fArray = [NSArray arrayWithObjects:@"ff",@"gg",@"ii",nil];
NSMutableArray *mArray2 = [fArray mutableCopy];


// 追加
[mArray addObject:@"ABC"];
[mArray insertObject:@"abc" atIndex:1];
[mArray replaceObjectIndex:1 withObject:@"XYZ"];

// 削除
[mArray removeObjectAtIndex:3];
[mArray removeLastObject];


// ループ処理

/* インデックス */
for (i = 0; i < [array count]; i++) {
	NSLog(@"index: %d, value: %@\n", i, [array objectAtIndex:i]);
}


/* Enumerator */
NSEnumerator *enumerator = [array objectEnumerator];
id obj;
while (obj = [enumerator nextObject]) {
	NSLog(@"value: %@\n", obj);
}

/* 高速列挙 */
for (id obj in array) {
	NSLog(@"value: %@\n", obj);
}

連想配列

// ディクショナリを生成
NSDictionary *dict1 = [NSDictionary dictionaryWithObjectsAndKeys:
					@"miro", @"name",
					@"red"  , @"color",
					, nil];

// 要素を取得
id obj1 = [dict1 objectForKey:@"name"];

// キーを配列として取得
NSArray *kArray = [dict1 allKeys];

// 値を配列として取得
NSArray *kArray = [dict1 allValues];


// ディクショナリの要素数を取得
int dictCount = [dict1 count];


// 変更する場合
NSMutableDictionary *mDict = [NSMutableDictionary dictionary];

// 要素をセット
[mDict setObject:@"miro" forKey:@"name"];

// 要素を削除
[mDict removeObjectForKey:@"age"];
[mDict removeAllObjects];


// ループ処理

/* インデックス */
NSArray *keys = [dict allKeys];
for (i = 0; i < [keys count]; i++) {
	NSLog(@"key: %@, value: %@\n",
			[keys objectAtIndex:i],
			[dict objectForKey:[keys objectAtIndex:i]]);
}


/* Enumerator1 */
NSEnumerator *objEnumerator = [dict objectEnumerator];
id obj1;
while (obj1 = [objEnumerator nextObject]) {
	NSLog(@"value: %@\n", obj1);
}

/* Enumerator2 */
NSEnumerator *keyEnumerator = [dict keyEnumerator];
id key;
while (key = [keyEnumerator nextObject]) {
	NSLog(@"key: %@, value: %@\n", key, [dict objectForKey:key]);
}


/* 高速列挙 */
for (id key in dict) {
	NSLog(@"key: %@, value: %@\n", key, [dict objectForKey:key]);
}

/* NSEnumeratorをループ */
NSEnumerator *enumerator = [dict objectEnumerator];
for (id obj in enumerator) {
	NSLog(@"value: %@\n", obj);
}

テキストファイルの読み込みと書き出し

// 読み込み
NSString* text;
NSError* error;
text = [NSString stringWithContentsOfFile:@"/Users/memememomo/text.txt" encoding:NSUTF8StringEncoding erro:&error];

if (text) { 

}
else {
	NSLog([error localizedDescription]);
}


// 書き出し
NSString* text = @"Cocoa programming";
NSError* error;

BOOL result = [text writeToFile:@"/Users/memememomo/test.txt" atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (result) {

}
else {
	NSLog([error localizedDescription]);
}

オブジェクト指向

// インタフェースの宣言
@protocol Zukei
	@required // デフォ、実装必須
	- (void) draw;
	- (void) paint;

	@optional // 実装必須ではない
	- (void) move;
	- (void) resize;
@end


// インタフェースの採用
@interface Maru : NSObject <Zukei>

@end


// どのクラスのオブジェクトか
id obj = [[TestCls alloc] init];

// クラス名を取得する
NSString *className = [obj className];

// あるクラスのオブジェクトか
BOOL bool1 = [obj isMemberOfClass:[TestCls class]];


// インスタンスの生成の仕方
Class cls1 = [TestCls class];
Class cls2 = [obj class];
Class cls3 = NSClassFromString(@"TestCls")

セッター関数

#import <Foundation/Foundation.h>

@interface MyClass : NSObject {
	NSObject *myObj;
}
- (NSObject *)myObj;
- (void)setMyObj:(NSObject *)argMyObj;
@end

@implementation MyClass
- (NSObject *)myObj {
	return myObj;
}

// セッターメソッド
- (void)setMyObj:(NSObject *)argMyObj {
	if (myObj != argMyObj) {
		[myObj release];
		myObj = [argMyObj retain];
	}
}

- (void)dealloc {
	NSLog(@"dealloc called. release `myObj`.");
	[myObj release];
	[super dealloc];
}
@end


int main(void) {
	
	NSObject *testObj = [[NSObject alloc] init];
	printf("%d\n", [testObj retainCount]);

	MyClass *myCls = [[MyClass alloc] init];
	myCls.myObj = testObj;
	printf("%d\n", [testObj retainCount]);


	[testObj release];
	print ("%d\n", [myCls.myObj retainCount]);

	[myCls release];

	return 0;
}