一、OC基础语法
1、关键字基本上所有关键字都是以@开头,如:
@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
2、字符串以@开头
比如@"Hello"是OC中的字符串,而"Hello"则是C语言中的字符串
3、其他语法
基本数据类型:char、int、float、double、BOOL(YES\NO)
屏幕输出:NSLog(@“XXXXX”);NSLog(@“XXXisXX %i”,XX);
4、NSLog与printf的区别
NSLog接收OC字符串作为参数,printf接收C语言字符串作为参数
NSLog输出后会自动换行,printf输出后不会自动换行
使用NSLog需要#import
使用printf需要#include
5、一般形式:
#import <Foundation/Foundation.h> int main() { NSLog(@"helloworld"); return 0; }
6、#import的作用
跟#include一样,用来拷贝某个文件的内容
可以自动防止文件内容被拷贝多次,也就以为着头文件中不用加入下面的预处理指令了
#ifndef _STDIO_H_
#define _STDIO_H_
#endif
7、Foundation框架的作用
1.开发OC、iOS、Mac程序必备的框架
2.此框架中包含了很多常用的API(应用编程接口)
3.框架中包含了很多头文件,若想使用整个框架的内容,包含它的主头文件即可
#import
说明:
1> 主头文件:最主要的头文件,名字一般跟框架名称一样,包含了框架中的所有其他头文件
2> Foundation框架的主头文件名称就是Foundation.h
3> 只需要包含Foundation框架主头文件,就可以使用整个框架的东西
运行过程:
1> 编写OC源文件:.m、.c
2> 编译:cc -c xxx.m xxx.c
3> 链接:cc xxx.o xxx.o -framework Foundation
(只有用到了Foundation框架才需要加上-framework Foundation)
4> 运行:./a.out
8、BOOL的使用
BOOL类型的变量有2种取值:YES、NO
#define YES (BOOL)1
#define NO (BOOL)0
BOOL的输出(当做整数来用)
NSLog(@"%d %d", YES, NO);
9、多个.m文件的开发
跟C语言中多个.c文件的开发是一样的
编写3个文件
// main.m #import "one.h" int main() { test(); return 0; } // one.h void test(); // one.m #import <Foundation/Foundation.h> void test() { NSLog(@"调用了test函数"); }
终端指令
编译:cc –c main.m test.m
链接:cc main.o test.o –framework Foundation
运行:./a.out
10、.m文件和.c文件混用开发
编写3个文件
// main.m #import "one.h" int main() { test(); return 0; } // one.h void test(); // one.m #import void test() { NSLog(@"调用了test函数"); }
终端指令
编译:cc –c main.m one.c
链接:cc main.o one.o
运行:./a.out
(没有使用Foundation框架的话,就不用-framework Foundation)
二、OC的类和对象
1、类的声明
1)类的设计:
1> 类名
* 类名的第一个字母必须是大写
* 不能有下划线
* 多个英文单词,用驼峰标识(每个单词首字母大写)
2> 属性
3> 行为(功能)
注:拥有相同(或者类似)属性和行为的对象都可以抽像出一个类
#import <Foundation/Foundation.h> // 类的声明 @interface Car : NSObject { @public int wheels; // 多少个轮子 int speed; // 时速 } - (void)run; // 跑的行为 @end
成员变量
@interface的大括号{}中声明的变量:wheels、speed
@interface的大括号和函数的大括号是不一样的
默认会初始化为0
@public
@public可以让Car对象的wheels和speed属性被外界访问
NSObject
加上:NSObject的目的是让Car类具备创建对象的能力
2、类的实现
用来实现@inteface中声明的方法
方法的实现(说清楚方法里面有什么代码)
// 类的实现
@implementation Car
- (void) run
{
NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels, speed);
}
@end
1.只要是OC对象的方法,必须以减号 - 开头
2.OC方法中任何数据类型都必须用小括号()扩住
3.OC方法中的小括号():括住数据类型
注:
没有@interface,只有@implementation,也是能成功定义一个类的
@implementation Car : NSObject { @public int wheels; // 多少个轮子 int speed; // 时速 } - (void) run { NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels, speed); } @end // @implementation中不能声明和@interface一样的成员变量
3、创建对象
代码编写
// 主函数 int main() { // 创建车子对象 Car *c = [Car new]; c->wheels = 3; c->speed = 300; [c run]; return 0; }
注:
1.在OC中,想执行一些行为,就写上一个中括号[行为执行者 行为名称]
2.利用类来创建对象
3.执行了Car这个类的new行为来创建新对象
4.定义了一个指针变量p,p将来指向的是Car类型的对象
5.[Car new]每次都会创建出一个新对象,并且会返回新对象本身(新对象的地址)
main函数的代码分析、内存分析(对象在内存中有成员)
[Car new]每次都会创建出新的对象,并且返回对象的地址,那么就应该用一个指针变量保存对象的地址
Car *c = [Car new];
用一个指针变量c指向内存中的Car对象
设置车子对象的属性
跟用指向结构体的指针访问结构体属性一样,用->
c->wheels = 3;
c->speed = 300;
4、创建多个Car对象
分别只设置wheels、speed属性
常见错误:Car *c1 = [Car new]; c1->wheels = 4; Car *c2 = [Car new]; c2->speed = 250; [c1 run]; 一个赋值给另一个,然后修改属性 Car *c1 = [Car new]; c1->wheels = 4; c1->speed = 250; Car *c2 = c1; c2->wheels = 3; [c1 run];
只有类的声明,没有类的实现
漏了@end
@interface和@implementation嵌套
两个类的声明嵌套
成员变量没有写在括号里面
方法的声明写在了大括号里面
5、方法
1>不带参数的方法
设计一个返回PI的方法2>带一个参数的方法
// 方法声明
- (double)pi;
// 方法实现
- (double)pi
{
return 3.14;
}
设计一个计算平方的方法3>带多个参数的方法
// 方法声明 - (double)square:(double)number; // 方法实现 - (double)square:(double)number { return number * number; }
设计一个计算和的方法4>方法名注意:
// 方法声明 - (double)sumOfNum1:(double)num1 andNum2:(double)num2; // 方法实现 - (double)sumOfNum1:(double)num1 andNum2:(double)num2 { return num1 + num2; }
1.冒号也是方法名的一部分5>OC方法注意:
2.同一个类中不允许两个对象方法同名 OC方法中
3.一个参数对应一个冒号
1.成员变量不能在{}中进行初始化、不能被直接拿出去访问
2.方法不能当做函数一样调用
3.成员变量\方法不能用static等关键字修饰,别跟C语言混在一起
4.类的实现可用写在main函数的后面,主要在声明后面就行了
5.方法只有声明,没有实现
6.方法没有声明,只有实现(编译器警告,但是能调用,OC的弱语法)
7.编译的时候:访问没有的成员变量直接报错,访问没有的方法,只是警告
6、方法和函数的区别:
方法
1.对象方法都是以减号 -
2.对象方法的声明必须写在@interface和@end之间
对象方法的实现必须写在@implementation和@end之间
3.对象方法只能由对象来调用
4.对象方法归类\对象所有
函数
1.函数能写在文件中的任意位置(@interface和@end之间除外),函数归文件所有
2.函数调用不依赖于对象
3.函数内部不能直接通过成员变量名访问某个对象的成员变量