OC完全兼容C(.m)语言,可以在oc语言中混入c(.c)语言代码甚至是c++(.mm)代码。
oc关键字:基本上所有关键字都是以@开头。
在c语言中用 “hello" 表示字符串,在oc 中用 @“hello" 表示字符串。
oc中的基本数据类型: char , int , float, double , BooL(Yes \ No);
BOOL 类型的本质:
typedef signed char BOOL ;
定义一个新类型代替 char 类型,由于char 类型可以做整型使用,所以BOOL 也可以做为整型输出。
BOOL类型变量有两种取值,Yes,NO.
在系统内部:# define YES (BOOL) 1;
# define NO (BOOL) 0;
nil 相当于 c语言中 NULL 或者0;
基本语句有: 循环语句( while , do while , for);
注释和 c 语言一样: // 和 /* ...*/
屏幕 输出和c语言不同的是用到了 NSLog(@"hello"); 并且 NSLog 中不用使用换行符 \n, 它会自动换行,并且输出时间日志等。
NSLog 在 foundation 框架中,所以当文件程序使用NSLOg 输出时 需要包含 foundation 框架的主头文件,就可以使用整个框架的东西,主头文件时最重要的文件,名字一般和框架名一样,一般都是框架名.h ,包含了框架中的所有其他文件。
OC 中使用 # import 来代替 # include ;
# import 的作用:
跟# include 一样,拷贝文件的内容;
自动防止文件的内容被重复拷贝、
C语言是面向过程的,关注的事解决问题需要哪些步骤,OC是面向对象的语言,关注的事需要哪些对象。
专业术语:
面向过程: Procedure oriented
面向对象:Object oriented
面向对象编程:Object oriented programming
面向对象中有两个重要的概念:类和对象。类是抽象的,对象是具体的。
OC中面向对象1:oc 中的类相当于图纸,用来描述一类事物:,也就是说要想创建对象必须先有类。
2:oc利用类来创建对象,对象是类的具体存在。
3:因此,面向对象解决问题应该是先考虑需要设计哪些类,在利用对象创建多少对象。
类是无数个对象相同属性的概括,描述。
类的设计:1: 事物名称 (类名)
2:属性
3:行为(功能)
一般的名词都是类,拥有相同或者类似属性和行为的对象都可以抽象出一个类。
类命名规范:第一个字母必须大写,并且不能用下划线。 多个英文单词时,第一个英文单词要大写,使用驼峰标示。
哪个对象最清楚这个行为,就把这个行为写到哪个对象中去。
完整的写一个类;类的声明和实现。
类的声明用来声明对象的属性,行为。
例如:
@interface Person :NSObject
// 类继承自NSObject 可以让类具有创建对象的能力
{ @public
// 可以让后面的指针变量修改成员变量的值
int age ;
// 年龄属性
double height;
// 身高属性
}
- void run ;
@end
声明了一个类,大括号里写类的属性。属性中的成员变量默认的初始化都是0. 方法的声明不能在大括号里。
@implementatio Person
- void run
{
NSLog (@"跑起来了");
// 方法的实现
}
@end
类的实现中写方法的实现
# imort <Founntation/Fountation.h>
int main ()
{
Person * a = [Person new ];
// 这句代码执行后就会创建一个新的person 对象。
// 每次执行这样的代码都会生成新的对象
// 用一个person 类型的指针指向 这个新对象
a->age = 12;
// 对新对象中的age 成员变量进行赋值操作。
[ a run ];
// 给 a 指向的对象发送一条run 消息,就是说a 指向的对象要执行run这个函数。
}
在类中操作对象修改对象,只能通过指针进行
方法的命名规范:
只要是oc的方法必须以减号 - 开头。
对象方法中的数据类型必须要用小括号括起来,小括号只能扩住数据类型。
不接收任何形式参数: - void run ;
方法的声明在类的声明里,方法的实现在类的实现中。方法依赖于类的存在而存在。
带形参的方法:
例如:
- ()方法名:()形参名;
// 此时有一个形参
oc 方法中一个形参对应一个冒号
冒号也是方法名的一部分
不能两个对象方法同名
类的内存剖析:
我们了可以利用一个类创建出无数个对象,每个对象都是自己的属性。并且共用一份方法。
在使用类创建对象之前,系统会先把类加载进内存,且只加载一次,然后在创建新的对象,但是每次创建新对象都会给新对象分配一个新的内存地址。
在内存中类中只存放了方法列表,,、每个对象内部都有一个isa 指针,这个指针指向它所对应的类,当对象调用某个方法时就会顺着isa 指针在类中寻找对应的方法,找不到的话,就去父类中找。当方法内部要返回成员变量时,就会访问当前对象中的成员变量。
oc中的对象一旦创建,即使是在代码块中也不会随着代码块的结束而结束,代码块的内存空间依然存在,除非文件结束或者手动清除。
类的一些常见错误:
1:只有类的声明没有类的实现。
2:漏掉了@end
3: @interface 和 @implementation 嵌套
4:两个类的声明嵌套
5:成员变量没有写在大括号内
6:方法写在了大括号内
语法细节: 成员变量不能在大括号内部进行初始化,不能直接被赋值。
方法不能当做函数一样调用。
不能随便将成员变量当做c语言中的变量一样用一些关键词进行修饰。
类的实现可在main 函数之后。只要在类的声明之后就行、
oc 方法与函数的区别;
1:方法只能用在类中,只能声明在@interface 实现在@ implementation 中。
2:方法不能独立与类存在,而函数与类没有任何关系。函数归整个文件所有。
3:方法只能由对象调用。函数没有任何要求限制,可以写在任何地方,只要不在@interface 和@ end 之间就行。
4:函数内部不能直接访问成员变量,因为函数与对象没有任何关系。
类也可以只有实现没有声明
例如:
@ implementation Dog : NSObject
{
int age ;
double height;
}
-( void ) run
{
NSLog (@"跑起来了");
}
@end
这样也可以使用一个类,但是不能在类的实现中定义和类的声明中相同的成员变量。
匿名对象: car *c ;
c = [Car new ];
c-> speed = 130;
其实这三行相当于:
[Car new ]-> speed = 130;
因为这个新对象没有任何指针指向它,所以没有名,成为匿名对象
误区: [Car new ]-> speed = 130;
[[Car new ] run ];
// 这句语句有问题,因为这是相当有新建了一个对象然后调用新建对象的 run方法,可是这个容易引起歧义,在内存中是错误的。