#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"Hello, World!");
}
return 0;
}
1)#import <Foundation/Foundation.h>, 告诉编译器找到并处理名为Foundation.h文件,这是一个系统文件,#import表示将该文件的信息导入到程序
2)int main(int argc, const char * argv[]),这个方法是程序的入口。参数argc-参数数目,argv-参数值。
3)@autoreleasepool{ }这是一个自动释放池,用于回收对象的存储空间
4)NSLog是Foundation框架提供的Objective-C日志输出函数,与标准C中的printf函数类似,并可以格式化输出。
@“Hello, World!”,是代表NSString字符串对象
5)最后是return 0语句,它表示要终止main的执行,一般情况下0代表正常结束,非0代表异常情况, 这是沿用了C语言的习惯。
面试题
1、为什么要使用import,import和include的区别?
//include 和import都是引入头文件
//import引入的头文件,可以防止重复包含
//include需要配合预处理指令才能防止重复包含,如果没有写预处理指令,则无法防止重复包含问题
2、import 和@class的区别?
NSLog和printf使用的差异:
//1、NSLog 会自动换行 而printf不会自动换行
//2、NSLog 会自动输出时间等项目信息,printf不会输出调试信息
//3、NSLog 函数参数是一个NSString对象
// printf接收的是字符串指针变量
NSLog和printf可以混着用吗?
注意:
1)不能使用Printf打印OC中的对象 (%@占位符不能用),没有结果。
NSLog格式化输出
//oc中特有的字符串表示方法
NSString *str = @"hello itcast!";
NSLog(@"string is:%@",str);//使用占位符,%@表示打印一个对象,%@ OC特有的
NSLog(@"this is a test"); //打印一个字符串
NSLog(@"x=%d, y=%d",10,20);//使用多个占位符,%d表示整型数
//***********OC中注释及@符号使用*************
1、“@”的使用方法 在OC中“@”有特殊的用法
1)@"" 这个符号表示将一个C的字符串转化为OC中的字符串对象NSString.
2)@标识符 OC中大部分的关键字都是以@开头的,比如@interface,@implementation,@end等
2、OC中注释 OC中的注释有两种:
1)单行注释://
2)多行注释:/* */
3)文档注释:/** */
/**
* 狗吃食物的方法
@class等。
*
* @param foodName 参数描述
*/
4)条件编译注释
#if 0
#endif
注意:多行注释不能嵌套
//***************OC和C差异学习***********
OC和C差异学习(一)
1、源文件对比
//在C语言中,我们遇到不同后缀的文件有哪些?
.c .o .out .h
//在OC中常见的文件有两种:
.h 和.m的文件
OC新增:增强型for循环,可以快速遍历数组、字典等集合
NSArray *arr =@[@"AAAA",@"BBBB",@"CCCC"];
for (NSString *str in arr) {
NSLog(@"%@",str);
}
函数(方法)定义和声明对比
//C语言中函数的声明和实现
i.函数声明:
int sum(int a,int b);
ii.函数定义
int sum(int a,int b){
return a+b;
}
//OC语言中函数习惯称之为“方法”
i.方法声明:
-(int)sum:(int) a andB:(int) b;
ii.方法定义
-(int)sum:(int) a andB:(int )b{
return a+b;
}
OC和C差异学习(二)
1、OC新增的数据类型介绍
1)逻辑型
(1)Boolean
//Boolean 类型指的是用于存储真值和假值的变量,一般用于程序流程控制 。
//Boolean 类型数据允许取值 true 或 false ,也可以是0或非0的整数替代 true 和 false
(2)BOOL
//用作逻辑判断
BOOL flag =YES;
//flag通常被赋值为YES或NO(1或0)
2、OC中的新增异常捕捉方法
@try .... @catch .... @finally
格式:
@try {
//此处放的是有可能出错的代码
< #statements#>
}
@catch (NSException *exception) {
//捕捉最具体的异常类型 < #handler#>
}
@catch (NSException *ne) {
//捕获一个比较重要的异常类型。
}
@catch (id ue) {
//再次掷出捕获的异常。
}
@finally {
//不管有没有异常finally内的代码都会执行。 < #statements#>
}
//****************面向对象编程的概念****************
面向对象和面向过程的区别:
//面向过程
强调的是功能行为
关注的是解决问题需要哪些步骤
//面向对象
将功能封装进对象,强调具备了功能的对象
关注的是解决问题需要哪些对象
面向对象是基于面向过程的。
1、什么是类?
//某一些具有共同特征和行为的事物的抽象。类是具有相似内部状态和运动规律的实体的集合(或统称、抽象)。
2、什么是对象?
//类的实例。
1)类和对象之间的关系
类(Class) 一个类由3个部分构成
类的名称:类名
类的属性:一组包含数据的属性
类的方法:允许对属性中包含的数据进行操作的方法
对象(Object)
是系统中的基本运行实体
对象就是类类型(class type)的变量
定义了一个类,就可以创建这个类的多个对象
一个类就是具有相同类型的对象的抽象
//********************类的声明和实现***************
//类
.h:类的声明文件,用于声明成员变量、方法。类的声明使用关键字@interface和@end。
注意:.h中的方法只是做一个声明,并不对方法进行实现。也就是说,只是说明一下方法名、方 法的返回值类型、方法接收的参数类型而已,并不会编写方法内部的代码。
.m:类的实现文件,用于实现.h中声明的方法。类的实现使用关键字@implementation和@end。
//方法
方法的声明和实现,都必须以 + 或者 - 开头
+ 表示类方法(静态方法)
- 表示对象方法(动态方法)
在.h中声明的所有方法作用域都是public类型,不能更改
//成员变量(实例变量\属性)
成员变量的常用作用域有3种:
@public 全局都可以访问
@protected 只能在类内部和子类中访问
@private 只能在类内部访问
类的定义:
1)类的声明(规定当前类的:类名、属性、行为)
@interface 类名:父类名称
{
//定义成员变量(类的属性,实例变量)
}
//类的方法(行为,功能)!!!!!!!!
@end
2)类的实现(实现具体行为)
@implementation 类名
//方法的具体实现(行为、功能、)
@end
//*****************创建一个对象并访问成员变量*************
1、创建一个对象
Car *car1 = [Car new];
//理解方式一:(C)
//定义了一个Car类型的指针变量,指针变量指向新申请的内存空间
//理解方式二:(oc)
//******用Car类实例化了一个实例对象,对象的名称是car1
只要是用new操作符定义的实体就在会堆内存中开辟一个新的空间。
*******注意:
[Car new];
在内存中干三件事:
1.开辟存储空间
2.初始化成员变量(写在类声明大括号中的属性就叫成员变量,也叫实例变量)
3.返回指针地址
对象->对象成员(注意声明属性为:@public) 的方式操作对象中的成员
//************无参方法声明实现及调用**************
OC中的方法分为:对象方法和类方法:
//对象方法(减号方法、动态方法(因为它分配了内存))
(1)对象方法以-开头如 -(void)xx;
(2)对象方法只能由对象来调用
(3)对象方法中可以访问当前对象的成员变量
(4)调用格式 [对象名 对象方法名];
//类方法(加号方法、静态方法)
(1)类方法以+开头 如+(void)put;
(2)类方法只能由类来调用
(3)类方法中不能访问实例(成员)变量,因为类方法由类来调用,并没有创建存储空间来存储类中的成员变量。
(4)调用格式:[类名 类方法名];
(5)类方法的好处和适用场合:
不依赖于对象,执行效率更高;
能用类方法解决的问题,尽量使用类方法;
场合:当方法内部不需要使用到成员变量时,可以改为类方法。
//***********1、无参方法声明实现及调用
1)不带参数的方法
声明:
-(void)run;
2、方法的调用
//oc中方法的调用有两种:
1)[类名或者对象名 方法名];
Car *car1 =[Car new];
[car1 run]; //向car1对象发送了一条调用run方法的消息(消息机制)***************
2)对象名.方法名 (点语法,以后再讲)
//************2、有参方法声明实现及调用
带参数的方法的定义和实现:
-(返回值类型)方法名1:(参数类型) 参数名; //有一个参数的方法
-(返回值类型)方法名1:(参数类型1) 参数名1 and:(参数类型2) 参数名2; //有2个参数的方法
方法的声明
-(int)sum:(int) x and:(int) y;
//有参方法的使用注意:
// 方法的类型 (-)对象方法
// 方法的返回值: int 类型
// 方法的参数是: x y
// 参数的类型: 第一个 int 第二个 int
// 方法名: sum: and: (冒号是方法名的一部分)
方法的实现
-(int)sum:(int) x and:(int) y{
return x+y;
}