一 OC 初认知
OC 是在C 语言的接触上,增加了面向对象的语法,完全兼容C语言,可以在OC代码中混入C语言,甚至C++
OC可以用来开发 MAC OS X 平台和 iOS平台的应用程序。
二 OC 语法
1 关键字
基本上所有关键字都以@开头,
OC 常见关键字 @protocol、@optional、@required、@class
@property、@synthesize、@dynamic
self、super、id、_cmd、__block、__strong、__weak、
@interface、@implementation、@end
@public、@protected、@private、@selector
@try、@catch、@throw、@finally
2 字符串以@开头
例如 @"hello OC"
3 其他语法
基本数据类型 包括: char int float double bool (YES/NO)
基本语句
循环语句(do while .while.for)
条件语句 (if, if-else.switch)
屏幕输出 NSLog(@"")
4 终端指令
编译 cc -c main.m
链接 cc main.o - framework foundation
运行 ./a.out
5 NSLog与printf的区别
NSLog接收OC字符串作为参数,printf接收C语言字符串作为参数
NSLog输出后会自动换行,printf输出后不会自动换行
使用NSLog需要#import <Foundation/Foundation.h>
使用printf需要#include <stdio.h>
6 #import 的作用
跟#include一样,用来拷贝某个文件的内容
可以自动防止文件内容被拷贝多次,也就以为着头文件中不用加入下面的预处理指令了
7 Foundation框架的作用
开发OC、iOS、Mac程序必备的框架
此框架中包含了很多常用的API(应用编程接口)
框架中包含了很多头文件,若想使用整个框架的内容,包含它的主头文件即可
三 面向对象和面向过程思想
面向过程关注的是解决问题需要哪些步骤;面向对象关注的是解决问题需要哪些对象 决问题的目的,但是解决思路不一样
面向对象是告诉对象去干什么,至于怎么实现不去关心,
面向对象编程 Object Oriented Programming,简称OOP
现实生活中面向对象的例子
想打电话\发短信 à 找手机,不用分析电话要怎样才能拨通
去饭店吃饭 à 找服务员,不用分析怎么到厨房炒菜
汽车坏了 à 找汽车维修工,不用分析修车的步骤
境界:万物皆对象
四 类和对象的关系
1 OC中类相当于图纸,用来描述一类事物。也就是说,要想创建对象,必须先有类
2 OC利用类来创建对象,对象是类的具体存在
3 面向对象解决问题应该是先考虑需要设计哪些类,再利用类创建多少个对象
OC 中一般分两步实现类和对象,类的声明,类的实现
类的声明 步骤
编写代码 定义 一个类拥有一定的属性 属性和类的命名规则依据标识符的规则 命名有意义驼峰标志,首字母大写字母
#import <Foundation/Foundation.h>
@interface Car : NSObject
{
@public
int wheels; // 多少个轮子
int speed; // 时速
}
- (void)run; // 跑的行为
@end
2 成员变量
@interface的大括号声明的变量:wheels,speed 默认会初始化为0
3 @public可以让Car对象的wheels和speed属性被外界访问
4 加上NSOBject目的让car拥有创建对象的能力
类的实现
@implementation Car
- (void) run
{
NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels, speed);
}
@end
主函数编写
int main()
{
// 创建车子对象
Car *c = [Car new];
c->wheels = 3;
c->speed = 300;
[c run];用一个指针变量c指向内存中的Car对象
设置车子对象的属性
跟用指向结构体的指针访问结构体属性一样,用->
c->wheels = 3;
c->speed = 300;
return 0;
[Car new]每次都会创建出新的对象,并且返回对象的地址,那么就应该用一个指针变量保存对象的地址
Car *c = [Car new]
}
对象与函数参数
对象成员变量作为函数参数
指向对象的指针作为函数参数
修改指向指向对象的成员
修改指针的指向
四 类的声明和实现
1 常见错误
只有类的声明,没有类的实现
漏了@end
@interface和@implementation嵌套
两个类的声明嵌套
成员变量没有写在括号里面
方法的声明写在了大括号里面
2 语法细节
成员变量不能在{}中进行初始化、不能被直接拿出去访问
方法不能当做函数一样调用
成员变量\方法不能用static等关键字修饰
类的实现可用写在main函数的后面,主要在声明后面就行了
3 OC方法和函数的区别
C方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在
C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有
C函数不能访问OC对象的成员
4 OC的方法注意
方法只有声明,没有实现(经典错误)
方法没有声明,只有实现(编译器警告,但是能调用,OC的弱语法)
编译的时候:访问没有的成员变量直接报错,访问没有的方法,只是警告
5 方法调用
6 方法名注意
冒号也是方法名的一部分
同一个类中不允许两个对象方法同名
五 get 方法 和 set方法
1 @public的成员可以被随意赋值,应该使用set方法和get方法来管理成员的访问
2 set方法 作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值
命名规范: 方法都是以set开头,而且后面跟上成员变量名,成员变量名的首字母必须大写
形参名称不要跟成员变量同名
3 get方法
作用:返回对象内部的成员变量
命名规范:get方法的名称一般就跟成员变量同名
4. 成员变量的命名规范
成员变量都以下划线 _ 开头
可以跟get方法的名称区分开
可以跟其他局部变量区分开,一看到下划线开头的变量,肯定是成员变
实例
/* 人 类名:Person属性(成员变量\实例变量):体重、年龄行为(方法):走路、吃*/
#import <Foundation/Foundation.h>
/*
1.类的声明 * 成员变量 * 方法的声明 */
@interface Person : NSObject
{
@public
int age;
double weight;
}
- (void)walk;
- (void)eat;
@end
// 2.类的实现
@implementation Person
// 实现@interface中声明的方法
- (void)walk
{
NSLog(@"%d岁、%f公斤的人走了一段路", age, weight);
}
- (void)eat
{
NSLog(@"%d岁、%f公斤的人在吃东西", age, weight);
}
@end
int main()
{
// 在使用类创建对象之前,会将类加载进内存
Person *p = [Person new];
p->age = 20;
p->weight = 40;
[p eat];
[p walk];
Person *p2 = [Person new];
p2->age = 30;
p2->weight = 60;
[p2 eat];
[p2 walk];
5 封装的好处
过滤不合理的值
屏蔽内部的赋值过程
让外界不必关注内部的细节
五 类方法
类方法直接可以用类名来执行的方法
类方法和对象方法对比
1) 对象方法
以减号-开头
只能让对象调用,没有对象,这个方法根本不可能被执行
对象方法能访问实例变量(成员变量)
2) 类方法
以加号+开头
只能用类名调用,对象不能调用
类方法中不能访问实例变量(成员变量)
使用场合:当不需要访问成员变量的时候,尽量用类方法
类方法和对象方法可以同名
3 self 关键字
1. 成员变量和局部变量同名
当成员变量和局部变量同名时,采取就近原则,访问的是局部变量
用self访问成员变量,区分同名的局部变量
2. 使用细节
出现的地方:所有的OC方法中(对象方法\类方法),不能出现在函数
作用 使用 "self->成员变量名" 访问当前方法调用的成员变量
使用 "[self 方法名];" 来调用方法(对象方法\类方法)
3. 常见错误
低级错误:用self去调用函数
类方法中用self调用对象方法,对象方法中用self调用类方法
self死循环
|