Datatype
基本类型
void, char bool, int, long, float, double
在Foundation中为这些数据定义了别名,NSInteger为long, CGFloat为double,BOOL等。
基本对象类型
id
引用对象实例变量的指针
常见对象类型
NSLog
NSNumber
NSString, NSMutableString
NSArray, NSMutableArray
NSSet, NSMutableSet
NSDictionary, NSMytableDictionary
NSURL, NSImage
NSNumber
NSNumber是Objective-c的数字对象。需求考虑内存释放问题。
NSNumber *number = [NSNumber numberWithInt:123]; NSLog(@"%i",[number intValue]); NSLog(@"%i",[number retainCount]); //输出 2010-12-29 16:02:35.040 HelloWorld[4710:a0f] 123 2010-12-29 16:02:35.042 HelloWorld[4710:a0f] 1
NSString和NSMutableString
NSString是不可变字符串(NSContantString),其变量和其本类型一样不需要手动释放(它的retainCount为-1)。
NSString赋值: NSString *str1 = @"str...."; //(不需要手动释放) NSString *str2 = [[NSString alloc] initWithString:@"str..."]; //不需要手动释放
因为对NSString赋值,会产生成的对象,所在方法中用NSString作临时对象,也要考虑内存开消问题。
NSMutableString是可变字符串,若用 “[[NSMutableString alloc] init...]”方法初始化,需要考虑手动释放。
NSString *str = @"this is str..."; NSMutableString *mstr = [NSMutableString stringWithString:str]; str = @"sss"; NSLog(@"%@",mstr); NSLog(@"%@",str); 输出: this is str... sss
注:因为NSMutableString是NSString的子类,实际应用中很可以把NSMutableString变量赋给NSString。所以若用NSString做类的属性,也会用手动释放的方式:
//接口文件 @interface TestProperty : NSObject { NSString *name; NSInteger myInt; } @property (copy,nonatomic) NSString *name; @property NSInteger myInt; @end
//实现类 @implementation TestProperty @synthesize name; @synthesize myInt; -(void) dealloc{ self.name = nil; [super dealloc]; } @end
//实例 int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSMutableString *str1 = [NSMutableString stringWithString:@"this is str"]; NSMutableString *str2 = [NSMutableString stringWithString:str1]; [str2 appendString:@"sss"]; NSLog(@"%@",str1); NSLog(@"%@",str2); [pool drain]; return 0; } //输出 2010-12-30 11:43:13.511 HelloWorld[2119:a0f] this is str 2010-12-30 11:43:13.521 HelloWorld[2119:a0f] this is strsss 可以看出str2不是指向str1的,而是新的对象!!
NSArray和NSMutableArray
NSArray是不可变数组,一般用于保存固定数据。和NSString不同的是,NSArray有retainCount,所以释放问题。
NSMubleArray是变数组,可以直接对其值进行操作。也可考虑释放问题。
NSMubleArray是NSArray的子类。
NSArray *arr = [NSArray arrayWithObjects:@"Sep",@"Januay",@"",nil]; NSArray *arr_ = [arr sortedArrayUsingSelector:@selector(compare:)]; NSLog(@"%i",[arr retainCount]); for(NSString *name in arr_){ NSLog(@"%@",name); } //输出 2010-12-29 13:36:16.830 HelloWorld[3325:a0f] 1 2010-12-29 13:36:16.833 HelloWorld[3325:a0f] Januay 2010-12-29 13:36:16.833 HelloWorld[3325:a0f] Sep
代码
NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"Sep",@"Januay",@"",nil]; [arr sortUsingSelector:@selector(compare:)]; NSLog(@"%i",[arr retainCount]); for(NSString *name in arr){ NSLog(@"%@",name); } //输出 2010-12-29 13:41:34.925 HelloWorld[3415:a0f] 1 2010-12-29 13:41:34.928 HelloWorld[3415:a0f] Januay 2010-12-29 13:41:34.930 HelloWorld[3415:a0f] Sep
NSSet和NSMutableSet
NSSet和NSMutableSet分别是不可变集合和可变集合。集合是一组单值的操作。NSSet和NSMutableSet都需要考虑释放问题。
代码
NSSet *set = [NSSet setWithObjects:[NSNumber numberWithInt:10],@"bb",@"aa",@"bb",@"aa",nil]; for(id *obj in set){ NSLog(@"%@",obj); } NSLog(@"%i",[set count]); NSLog(@"%i",[set retainCount]); //输出 2010-12-29 13:56:08.397 HelloWorld[3709:a0f] 10 2010-12-29 13:56:08.400 HelloWorld[3709:a0f] aa 2010-12-29 13:56:08.401 HelloWorld[3709:a0f] bb 2010-12-29 13:56:08.401 HelloWorld[3709:a0f] 3 2010-12-29 13:56:08.402 HelloWorld[3709:a0f] 1
NSDictionary和NSMutableDictionary
dictionary是由键-对象对组成的数据集合。NSDictionay和NSMutableDicionary都需要考虑内存释放问题。
代码
NSDictionary *dict = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"val1",@"val2",nil] forKeys:[NSArray arrayWithObjects:@"key2",@"key1",nil]]; for(NSString *key in dict){ NSLog(@"%@",[dict objectForKey:key]); } NSLog(@"%i",[dict retainCount]); [pool drain]; //输出 2010-12-29 15:37:42.745 HelloWorld[4085:a0f] val2 2010-12-29 15:37:42.748 HelloWorld[4085:a0f] val1 2010-12-29 15:37:42.749 HelloWorld[4085:a0f] 1
由上面结果可以看出Dicionary是按Key排序的。
数组
int matrix[4][3] ={ { 1, 2, 3 },{ 4, 5, 6 },{ 7, 8, 9 } };//第4行为0 . int matrix[4][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };//一样的定义 如果数组大小没有说明,则有初始化列表确定。
结构
struct point { float x; float y; } start = {100.0, 200.0}; struct point end = { .y = 500, .x = 200 }; struct entry { char *word; char *def; } dictionary[1000] = { { ¨a〃, ¨first letter of the alphabet〃 }, { ¨aardvark〃, ¨a burrowing African mammal〃 }, { ¨aback〃, ¨to startle〃 } }; struct entry { char *word; char *def; } dictionary[1000] = { [0].word = ¨a〃, [0].def = ¨first letter of the alphabet〃, [1].word = ¨aardvark〃, [1].def = ¨a burrowing African mammal〃, [2].word = ¨aback〃, [2].def = ¨to startle〃 }; struct entry { char *word; char *def; } dictionary[1000] = { {.word = ¨a〃, .def = ¨first letter of the alphabet〃 }, {.word = ¨aardvark〃, .def = ¨a burrowing African mammal〃} , {.word = ¨aback〃, .def = ¨to startle〃} };
联合
union shared { long long int l; long int w[2]; } swap = { 0xffffffff }; union shared swap2 = {.w[0] = 0x0, .w[1] = 0xffffffff};
线程
NSProcessInfo
反射
NSClassFromString
KVC (Key Value Coding)
- (void) setValue:(id)value forKey:(NSString *)property; -(id) valueForKey:(NSString *)property; KVO (Key Value Observing)
当指定的对象的属性被修改了,允许对象接受到通知的机制。