objective-c是在c的基础上设计的一门面向对象的语言,它可以兼容c的语法,因为c的语法是它的一部分。xcode中.m文件只能使用oc,把名称改成.mm就可以进行oc与c++的混合编程了。要注意的是它们之间只能进行类跟对象的方法调用,不能直接在类的声明中声明另一个语言中类的对象,不然编译报错。
cocoa是苹果的一个开发框架,包含了许多个框架在里面。fundation框架是最基本框架,可以用于Mac os X,也可用于ios,它是在corefoundation基础上实现的,后者用纯c实现。appkit是一Mac os X的一个框架,包含了基本的视图控件。uikit类似appkit,是用于ios的,它们都是在core graphics上实现的,后者是纯c实现。加了core的一般是纯c实现,必进底层东西要求效率,使用c自然不过的了。
objective-c的一些类型如下:
NSString 字符串 NSMultableString 可变字符串
NSArray 数组 NSMultable 可变数组
NSDictionary *dict = [NSDictionarydictionaryWithObjectsAndKeys:@"123",@"key1",@"234",@"key2",nil,@"11111",@"222",nil];
dictionaryWithObjectsAndKeys创建了一个NSDictionary,nil告诉这个函数哪里结束,后面如果再加object:key的话,也是没用的,上面就是一个例子。
NSMutableDictionary *mdict = [NSMutableDictionary dictionary];
[mdict setObject:@"gugugu" forKey:@"qinwa"];
[mdict setObject:@"jiiji" forKey:@"xiaoji"];
for (NSString *key in mdict){
NSLog(@"%@:%@", key, [mdict objectForKey:key]);
}
NSMutableDictionary 是一个可变的字典类, dictionary方法可以创建一个实例, setObject: forKey是添加一个字典项。 上面for语句使用的是fast enumeration快速枚举,类似javazhongdeforeach。
// 装箱 拆箱
NSNumber *a = [NSNumber numberWithInt:1234];
NSNumber *s = @'d';
NSNumber *i = @1234;
NSLog(@"%c", [s charValue]);
// NSValue
SS sss = {2, 2};
NSValue * v = [NSValue valueWithBytes:&sss objCType:@encode(SS)];
SS pss;
[v getValue:&pss];
NSLog(@"%d %d", pss.a, pss.b);
<pre name="code" class="objc">// NSValue
int ii = 100;
NSValue * v = [NSValue valueWithBytes:&ii objCType:@encode(int)];
int iii;
[v getValue:&iii];
NSLog(@"iii:%d ", iii);
NSNumber是对基本类型进行的一个boxing操作。oc并没有提供自动装箱与拆箱操作,不知道未来会不会提供。可以用numberWith[TYPE]来装箱某个类型,[TYPE]Value来进行拆箱。
NSValue是NSNumber的父类,它可以包装一切对象。可以包装结构、类,基本类型也可以。它做的事情就是把对象的每个字节保存起来,@encode是编译器提供的一个命令,可以得到一个字符串,它用来描述一个类型的。