01-基本语法、类和对象

一、基本语法
1、Objectiv-C简介:

a、是C语言的基础上,增加了一层最小的面向对象语法;
b、完全兼容C语言;
c、可以在OC代码中混入C语言代码,甚至是C++代码;
d、扩展名是:.m,想写入c++代码,扩展名改成 .mm;

2、关键字:

基本上所有关键字都是以@开头;例如:@interface,@implementation,@end,@public等

3、字符串:

字符串以@开头 如:@”hello”;而"hello"是C语言字符串。

4、基本数据类型:char、int、float、double、BOOL(YES/NO);

BOOL类型的本质:typedef signed char BOOL;
有两种取值: YES/NO;
`#define YES (BOOL)1`
`#define NO (BOOL)0
BOOL的输出:当整数来用 %d/%i;

5、nil相当于C语言中的NULL,也就是0;
6、输出语句:

NSLog(@"hello"); NSLog(@"hello,%d",15);//输出内容后会自动换行

NSLog的用法与printf区别:
a、NSLog是Foundation框架下的东西,使用需要#import <Foundation/Foundation.h>;使用printf需要 #include<stdio.h>
b、NSLog输出时会自动换行,printf不会。
c、NSLog输出时写法@"xxxxx",参数需要的是NSString类型,而printf需要的是char* 类型的数据
d、OC中的字符串如果想打印用NSLog的%@,printf不能使用%@进行输出的
e、NSLog的时间初是不能去掉的

7、基本语句:

循环语句(do while、while、for)、条件语句(if、if-else、switch)

8、注释:“//”和“/....../”
9、 开发过程和C语言类似:.m源文件->编译->.o目标文件->链接->可执行文件

a、加载Foundation框架的所有内容#import <Foundation/Foundation.h>
b、#import用途:
(1)、跟include一样,拷贝文件的内容;
(2)、可以防止文件的内容被重复拷贝;
c、编译-链接-运行
编译:cc –c 文件名.c;
链接:cc 文件名.o –framework Foundation
运行:./a.out
d、主头文件:
(1)、最主要的头文件,名字一般跟框架名称一样,包含了框架中的所有其他头文件;
(2)、Foundation框架的主头文件名称就是Foundation.h;
(3)、只需要包含Foundation框架的主头文件,就可以使用整个框架的东西;

10、代码简单编写:第一个OC程序

#import <Foundation/Foundation.h>
int main()
{
NSLog(@"第一个OC程序");
return 0;
}

跟C语言一样,OC程序的入口依然是main函数,只不过写到一个.m文件中

二、类和对象
1、OC是面向对象的,C是面向过程的

区别分析:面向过程关注的是解决问题需要哪些步骤;面向对象关注的是解决问题需要哪些对象;两种思想都能达到解决问题的目的,但是解决思路不一样;

2、类和对象的关系:

类是对所有对象相同属性的概括,就是对象的描述。

a、面向对象开发步骤:首先考虑需要设计哪些类,再利用类创建多少个对象
(1)、设计类的步骤:类的名称(有意义的类名),属性,行为;
(2)、一般的名词都是类,类名的第一个字母必须是大写的,不能有下划线,多个英文单词,用驼峰标识(每个英文单词首字母大写);
(3)、拥有相同(或类似)属性和行为的对象都可以抽象出一个类;
(4)、哪个对象最清楚这个行为,就把这个行为写到哪个对象中去;

3、创建一个OC类:

完整地写一个类:类的声明和类的实现;(完整地写一个函数:函数的声明和定义(实现))
类名:1>类名的第一个字母必须大写;2>不能有下划线;3>多个单词间用驼峰标识。例如JumpZoombie

a、类的声明

@interface 类名 : NSObject// :NSObject目的是让类具备创建对象的能力
{
成员变量(实例变量):数据类型 成员变量名;
}
方法声明 - (数据类型)方法;
@end

b、类的实现

@implementation 类名
方法的实现
- (数据类型)方法
{
}
@end

c、使用注意

(1)、类的方法实现的时候,方法内可直接访问成员变量
(2)、类在内存中也占据存储空间,从头到尾只占据一块存储空间;
(3)、第一次创建对象的时候,首先分配内存给类,然后在分配内存给创建的对象;
(4)、在使用类创建对象之前,会将类加载进内存(只有一次),类的内存里只存放方法列表;
(5)、定义的对象内部都有一个默认的isa指针,指向对象所对应的类;
(6)、[p run]; [消息接收者 消息]:是给指针p所指向的对象发送一条run消息,对象会顺着isa指针找到对应的类,去类里找run方法。

d、实例分析:

//目的:因为使用了NSObject
#import <Foundation/Foundation.h>
//1、类的声明
//声明对象的属性、行为
//NSObject 目的是:让Car这个类具备创建对象的能力
//OC对象本身是结构体

@interface Car : NSObject
{
    //@public可以让外部的指针间接访问对象内部的成员变量
    @public
    
    //用来声明对象属性(成员变量,也叫实例变量,默认会初始化为0)
    int wheels;//轮胎的个数
    int speed;//时速(xxkm/h)

    //实例变量不允许在这里初始化 int wheels = 4这种写法是错误的
    //不能随便将成员变量当做C语言中的变量来使用 static int wheels;这种写法是错误的
}

    //方法(行为): 方法名 、 参数 、返回值 (声明、实现)
    //只要是OC对象的方法,必须以减号 - 开头
    //OC方法中任何数据类型都必须用小括号()括住
    //OC方法中的小括号()的作用只有一个:括住数据类型
    - (void) run;

    //类的声明完毕

@end



//2、类的实现
//用来实现interface中声明的方法
//方法的实现(说清楚方法里面有什么代码)
@implementation Car
  
- (void) run
{
    //方法内可直接访问、调用成员变量
    NSLog(@"%d个轮子、%d车速的车跑起来了",wheels,speed);
}

  //类的实现完毕

@end


int main()
{
    //在使用类创建对象之前,会将类加载进内存(只有一次),类的内存里只存放方法列表
    //定义的对象内部都有一个默认的isa指针,指向对象所对应的类
    //OC中,想执行一些行为,就写上一个中括号[行为执行者,行为名称]
    //利用类来创建对象
    //执行了Car这个类的new行为来创建新的对象
    //OC中只能用指针变量来间接操作对象
    //定义了一个指针变量p,p将来指向的是Car类型的对象
    //[Car new]会创建出一个新对象,并且会返回新对象本身(新对象的地址)
    Car *p = [Car new];
    Car *p2 = [Car new]; //又创建出一个新对象p2

    //给p所指向对象的wheels属性赋值4
    p->wheels = 4;
    p2->speed = 300;
    
    //给p所指向对象发送一条run消息 (OC中的消息机制)
    [p run];
    [p2 run];
    NSLog(@("p车有%d个轮胎,速度是%dkm/hnp2车有%d个轮胎,速度是%dkm/h"),p->wheels,p->speed,p2->wheels,p2->speed);
    
    //将p里存储的地址值,赋值给了p3,两个指向的地址值是相同的,指向同一个对象
    Car *p3 = p;
    p3->speed = 200;
    [p run];
    [p3 run];
  
    //将p2里存储的地址赋值给p
    p = p2;
    p->wheels = 3;
    [p run];
    [p2 run];

  return 0;
}

4、对象跟函数参数

a、OC里的对象不能自动回收;
b、书写类和对象注意事项:
(1)不能嵌套包含;
(2)方法的实现不能写在@interface中;
(3)方法的声明不能写在@implementation中;
(4)方法的声明不能写在定义属性的大括号{}中,一定要写在外面
(5)类内不能写其他新的类,想写另一个类,应写在@interface 类名 : NSObject @end @implementation 类名 @end的外面;
(6)在函数内不能直接写对象的实例变量;
(7)实例变量不允许初始化赋值;
(8)不能随便将实例变量当做C语言中的变量(实例变量不能用 static 修饰);
(9)类的声明必须放在main函数前面,类的实现可以放在后面;
(10)@implementation没有@interface也可以创建对象
(11)@implementation中不能声明和@interface一样的成员变量

5、方法与函数的区别

a、方法
(1)、对象方法都是以减号 - 开头,变量类型用()括住
(2)、OC方法的声明必须写在@interface和@end之间,方法的实现必须写在@implementation和@end之间。也就是说OC方法不能独立于类存在
(3)、对象方法只能由对象来调用
(4)、对象方法归类对象所有
b、函数
(1)、函数能写在文件中的任意位置(@interface和@end之间除外),函数归文件所有
(2)、函数调用不依赖于对象
(3)、函数内部不能直接通过成员变量名访问某个对象的成员变量
成员变量可以是任意类型,也可以是其他对象

6、方法的声明和实现

a、OC方法中,一个参数对应一个冒号:;
b、冒号的作用:分隔方法调用时的参数值;
c、不带参数的方法`- (double)pi; 方法名为pi`
d、带一个参数的方法
- (int)square : (int)num; 方法名为square :(冒号也是方法名的一部分)
e、带多个参数的方法
- (int)sumWithNum1 : (int)num1 andNum2 : (int)num2; 
(方法名为 sumWithNum1: andNUm2: )
f、同一个类中不允许两个对象方法同名

7、匿名对象(没有名字的对象)

@interface Car : NSObject
{
    @public
    int speed;
}
- (void) run;

@end


@implementation Car
- (void) run
{
    NSLog(@"%d个轮子、%d车速的车跑起来了",wheels,speed);
}
@end


int main()
{
    //属性访问
    [Car new]->speed = 300;
    
     //方法调用
    //每次都会创建新的对象,所以speed的值是0
    [[Car new] run];
    return 0 ;
}

不要写类似匿名对象这样的代码!!!

对象调用类方法 内存分析示意图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容