OC简介
1.objective-c其实可以简单看成带有附加属性的C语言,下面通过代码展现一个简单的oc程序:
#import<Foundation/Foundation.h>
int main()
{
NSLog(@"hello ,world");
return 0;
}
注意的是这个文件应该保存成.m文件,应该区分C语言中以.c后缀。另外需要说明的是oc本质上就是C语言,所以文件的main函数和结尾的return 0语句都是可以按照在C语言中学到过的只是去理解的。
但是毕竟还是一个有区别于C语言的语言,oc中也有一些自己独立的东西,比如在文件开始处的语句——#import<Foundation/Foundation.h>
熟悉C语言的应该清楚,在C语言中我们引入头文件一般使用#include<stdio.h>这种形式,但是在oc中我们一般使用#import<Foundation/Foundation.h>这种方式,因为使用#import<>这种方式可以保证你的头文件在程序运行过程中只被引用一次,不像#include<>那样得设置复杂的基于#ifdef宏命令才能保证头文件只被引用一次。
2.另外我们也注意到了#import<Foundation/Foundation.h>这个语句中包含了一个Foundation/Foundation.h,这个是一个框架,但是何为框架呢?框架就是聚集在一个单元的部件集合,,包括头文件,库,图像,声音文件等。Foudation框架处理的是用户界面之下的层中的特性,另外框架中包含数十甚至上百个头文件,每个框架都有一个主头文件,,它包含了所有框架的各个头文件。如果你想查看foundation包含哪些头文件,可以在/systerm/library/framework/foundation.framework/heades/下查看。
3.NSLog和@
(1)在C语言中你一定使用过printf()函数,在oc中NSLog函数的作用和printf()函数的作用相似,都是控制向控制台输出。另外NSLog函数也可以接收一个字符串作为其一个参数,很多时候NSLog函数可以由printf()函数代替,但是尽量使用NSLog函数,因为NSLog函数添加了一些自己的特性,如:时间戳、日起戳和自动换行。
(2)看到NSLog(@"hello ,world");这个语句我们一般都会怀疑@这个字符,注意这并不是输入出错,而是oc的一些特性,双引号的字符串前加上@表示引用的字符串作为NSString元素来处理。此外在objective-c中几乎所有的关键字都是以@开头。下面列举一些objective-c中常用的关键字:
@interface、@implementation、@end
@public、@protected、@private、@selector
@try、@catch、@throw、@finally
@protocol、@optional、@required、@class
@property、@synthesize、@dynamic
self、super、id、_cmd、__block、__strong、__weak、
这些关键字要做到熟稔于心。
(3)NSString有很多打包的特性,如:
*告知其长度
*将自身与其他字符比较
*将自身转化为整形值或者浮点值
4.BOOL类型
BOOL类型的本质是:
typedef signed char BOOL;
BOOL类型的变量有两种取值:YES,NO。注意书写的时候BOOL,YES,NO是大写。
BOOL小练习:
#import <Foundation/Foundation.h>
BOOL test(BOOL mybool)
{
return NO;
}
int main()
{
BOOL b = YES;
BOOL b2 = NO;
BOOL b3 = 1; // YES
BOOL b4 = 0; // NO
//NSLog(@"%i", b);
NSLog(@"%d", test(YES));
return 0;
}
根据上面的例子可以理解一下布尔类型的一些使用规则。
5.常用术语
(1)类是一种结构,它表示对象的类型,对象引用类来获取和本身有关的各种信息,特别是运行什么代码来执行什么操作,
(2)对象是一种结构,它包含值和指向其类的指针,
(3)实例是对象的另一种称呼,
(4)消息是对象可以执行的操作,用于通知对象去做什么。
(5)方法是为响应消息而运行的代码。
类的定义与使用
在oc中类的的定义和其他语言中不一样,他有自己固定的格式,应该包含以下一些信息:
(1)类名
*类名的第一个字母得用大写
*不能有下划线
*如果是多个英文单词,得用驼峰标识法
(2)属性
(3)行为
一般形式为:
@interface Car : NSObject
{// 用来声明对象属性(实例变量\成员变量,默认会初始化为0)
int wheels;
int speed;
}
// 方法(行为):方法名、参数、返回值(声明、实现)
// 只要是OC对象的方法,必须以减号 - 开头
// OC方法中任何数据类型都必须用小括号()扩住
// OC方法中的小括号():括住数据类型
- (void)run;
@end
// 2.类的实现
// 用来实现@inteface中声明的方法
@implementation Car
// 方法的实现(说清楚方法里面有什么代码)
- (void)run
{
NSLog(@"车子动起来了");
}
@end
下面我们做一个小练习:
#import<Foundation/Foundation.h>
@interface Person :NSObject
{int _age;
}
- (void)run;
- (void)setAge:(int)age;
- (int)age;
@end
@implementation Person
- (void)run
{
NSLog(@"%drenpaiqiali",_age);
}
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
@end
int main()
{
Person *p = [[Person alloc] init];
[p setAge:10];
[p run];
return 0;
}
运行结果为:
oc中的方法
@interface Person :NSObject
{
int _age;// 属性的定义
}
- (int)age;//方法的声明
@end
@implementation Person
- (int)age //方法的实现
{
return _age;
}
@end
这个格式一定要严格遵循。
匿名对象
在上面的学习中我们一般通过先创建一个对象,然后给这个对象进行成员变量的赋值和进行方法的调用,但是有时候我们也会见到一些特殊的情况,如:
#import<Foundation/Foundation.h>
@interface Car :NSObject
{
int speed;// 属性的定义
}
- (int)run;//方法的声明
@end
@implementation Car
- (int)run //方法的实现
{
NSLog(@"速度为%d的车子飞起来",speed);
}
@end
int main();
{
//19-21行是传统的赋值和调用放法的形式
//Car c = [Car new];
//c->speed = 100;
//[c run];
//接下来展示一种不常用的方法——匿名方法
[Car new]->speed = 300;//给实例变量赋值
[[Car new] run]; //调用方法
return 0;
}
运行结果为:
结果之所以是速度为0的车子跑起来了是因为每次执行[Car new]这个语句都会生成一个新的对象,虽然24行执行了给speed赋值的操作,但是接下来有执行了一个[Car new]语句,重新生成了一个新的对象。所以打印了默认的初始值0;