黑马程序员—Objective-C学习—基本语法、类和对象

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、基本语法

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、基本数据类型:charintfloatdoubleBOOL(YES/NO)

BOOL使用:

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中只能用指针变量来间接操作对象

    //定义了一个指针变量pp将来指向的是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/h\np2车有%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 ;

 }

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值