C作为学习Object-C(以后简称OC)的前缀已经差不多了,现在开始来直接上手OC。
还是在Xcode环境中直接新建一个命令行工程,类型选择FUNDATION。然后其他的就和原先一样了。
1 数据类型的变化
因为语言的历史关系吧,OC中大部分类和变量都是带NS开头的。例如:NSLog,NSString,NSInteger等等。按住command点变量可以和eclipse一样跟踪代码的定义,查看一下数据类型的具体定义。点进去发现,其实只是用typedef对基本数据类型进行了别名定义而已。但是,在查看定义的时候可以看出,在别名定义的时候,将一些数据类型进行了合并.
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
上面的代码看出将long和int进行了合并,都归为NSInteger了。
再一个是字符串,终于可以像java那样直接一个数据类型接收了,而不用再去考虑数组的存储了。用的数据类型就是NSString。
另外值得注意的是,在字符串的赋值方面,语法和Java的有些不一样,如下。
NSString string1 = @"这是一句话";
不过所幸的是至少可以直接字符串赋值了,而不用再去非得用一个函数才能进行字符串赋值了。
还有一个就是,在OC中对于所有数据类型的命名,都在前面加一个下划线。这不是硬性规定,但是默认俗称的约定。而且通常也非基本数据类型名字前面加*,这个好像在XCode中不写是会报错的。
2 类的编写语法
OC中建议的是一个类写一个文件,每一个类分为接口文件(即.h头文件)和实现文件(即.m实现文件)两个,类接口文件以@interface开头,以@end结束。具体代码:
#import <Foundation/Foundation.h>
@interface Class1 : NSObject{
@public
NSString *_name;
}
- (void) defindSelf;
- (void) introduceSelf;
@end
这里得说一下,上面的public就是公有的,如果不写就是默认的protected,即实例化的对象是不能访问的。所以这里如果想在实例里使用,这里就必须加上@public。
下面是方法的定义。 ‘-’ 表示该方法是实例方法,‘+’ 表示该方法是类方法,类似Java的static方法,即要通过类名进行调用,而不是通过实例调用。
类实现文件@implementation开始,以@end结束。具体代码:
#import "Class1.h"
@implementation Class1
- (instancetype) init {
_name = @"类1";
return self;
}
- (void) defindSelf{
NSLog(@"这是一个自定义方法");
}
- (void) introduceSelf{
NSLog(@"我是%@",_name);
}
@end
类中的方法调用(暂不提get和set方法)
通过中括号进行调用,里面第一个参数是类实例,第二个参数是方法名。
Class1 *c1 = [[Class1 alloc] init];
[c1 defindSelf];
3 工程文件
在Xcode中新建工程,会发现一个文件,删了报错,不删怪别扭的,里面的代码还很少,很熟悉,就是supporting Files。如下截图
就是如上图的.pch后缀的文件。其实这个文件是一个全局宏定义文件,在这里写的宏定义在工程的所有文件都可以看见。而且不用单独的去引入文件。
这就带来一个比较好的东西。安卓sdk一个很大的优势就在于他的松散耦合,资源抽离。我们可以把一些常用的字符串,一些重复使用的界面UI的属性参数,等等吧,在这里一起定义了,然后界面只是一个简单地调用。因为宏定义只是一个编译前的简单替换,所以我们可以通过把数据写在这里实现批量的替换。例如,在一个界面中写了很多的TextUI,需要设置字体,如果需求改了,要从新设置字体,挨个改起来很费时费力,而如此只需在这个宏定义里改一下即可。只是这样也要注意,尽量不要把太多的调用都写成一个数据,要不这个优点就反而成了鸡肋了。
4 C语言部分
结构体可以直接赋值,利用此特性,可以将数组直接放在结构体内,然后通过结构体直接赋值。