----------------------------
--1-- Xcode创建OC项目1.1 OC命令行项目--2-- NSLog函数和@符号2.1 NSLog的介绍2.2 NSLog使用方法2.3 NS前缀的含义2.4 @符号--3-- OC和C差异学习3.1 源文件对比3.2 基本语法对比3.3 OC新增的数据类型介绍3.4 OC中的新增异常捕获方法--4-- 面向对象4.1 编程的实质4.2 面向对象的基本概念--5-- 类和对象5.1 类和对象5.2 类的声明和实现5.3 对象的存储细节
----------------------------
【写在开头:】
class="core_title_txt pull-left text-overflow " title="〖今菲茜比〗『转载』符号组成的图案,很好玩的说...">『关于hello, world的由来,在C语言的博客中已经说了,在此,同样是使用这句话,来向iOS的学习之路开一个头。
苹果于2014年6月发表了swift。2015年6月8日,在WWDC2015上宣布,Swift将开放源代码,包括编译器和标准库。
但其Cocoa和Cocoa Touch等框架及现在很多公司的iOS程序还是以OC编写的所以,学习OC是必要的。
注意:
OC并不是一门全新的语言
OC完全兼容C语言
可以在OC代码中混入C语言代码,甚至是C++代码
可以使用OC开发Mac OS X平台和ios平台的应用程序
Objective-C,通常写作ObjC或OC,较少用Objective C或Obj-C,是扩充C的面向对象编程语言。它主要使用于Mac OS X和GNUstep这两个使用OpenStep标准的系统,而在NeXTSTEP和OpenStep中它更是基本语言。
Objective-C是面向对象的语言
由布莱德·考克斯(Brad Cox)基于Smalltalk改进而来 遵从ANSI C标准C语法,同时使用了Smalltalk的方法,在运行时可以灵活处理所有情,运行时(runtime)非常灵活:
Dynamic Binding 动态绑定
Dynamic Typing 动态检查
Dynamic Linking 动态链接
』
使用Xcode快速创建项目:
1)选择项目类型
2)填写相应的项目信息
创建完成-->
NSLog是cocoa的框架中提供的一个函数
NSLog的定义
NSLog定义在NSObjcRuntime.h中
FOUNDATION_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
实际上,NSLog很像printf,同样会在console中输出显示结果,不同的是,传递进去的格式化字符是NSString的对象,而不是char *这样的字符串指针
NSLog和printf使用的差异
1)NSLog 会自动换行 ,而printf不会自动换行
2)NSLog会自动输出时间等项目信息(日志形式),而pritnf不会输出调试信息
3)NSLog函数的参数是一个NSString对象,printf是一个字符串指针
int a = 5; float f1 = 2.3f; double d1 = 3.14; char ch = 'X'; char *str = "hello"; //能够运行,说明OC向下兼容C printf("%d,%.2f,%.2f,%c\n", a,f1, d1, ch); printf("%s\n", str); printf("----------------\n"); //NSLog格式化输出 NSLog(@"%d,%.2f,%.2f,%c", a,f1, d1, ch); //str是用字符串指针定义的,所以这里可以用%s格式化输出,但如果是NSString,则不能这样格式化输出字符串 NSLog(@"--->%s", str); printf("----------------\n"); //OC中自己特有的字符串表示方法 NSString *str1 = @"听雨"; //NSLog(@"%s", str1); //不能使用%s输出 NSLog(@"%@", str1); //正确输出 //使用printf能够打印str1吗? //pritnf("-->%@\n", str1); //不能,NSString是OC特有的C不支持
NSArray,NSString等NS前缀的类、函数归属于cocoa Fundation基础类库,其"NS”的由来据说是这样的:乔布斯被苹果开除后,创立了NeSt公司,而cocoa Fundation基础类库就是出自于NeST公司,NeST中的"NS"被作为Fundation中所有成员的前缀。
在OC中"@"符号有特殊的用途
1)@""; 这个符号表示将一个C的字符串转化为OC中的字符串对象NSString
2)@标识符 OC中大部分的关键字都是以@开头的,比如@interface,@imlementation,@end,@class等。
C语言中常见的后缀是:
.c .o .out .h .m
在OC中常见的文件有两种:.h和.m的文件
扩展名
源类型
.h
头文件,头文件包含方法,属性的声明。
.m
类的实现文件,参与编译的文件,用来实现类中声明的方法
1)数据类型对比学习
2)变量的定义对比
3)流程控制语句对比
新增:增强型for循环,可以快速遍历数组、字典等集合
逻辑型
1)Boolean(布林)
Boolean 类型指的是用于存储真值和假值的变量,一般用于程序流程控制
Boolean类型数据允许取值true或false,也可以是0或非0的整数替换true和false,这点和java语言不同
如C中是1和0表示真假,OC中也可以用true表示真 false表示假
用来存放true和false的结果的变量一般声明为Boolean
@autoreleasepool { Boolean flag = false; NSLog(@"%d", flag); //0 }
2)BOOL也是存放逻辑值的另外一种方法
BOOL //它的取值是YES和NO
YES 1 真
NO 0 假
BOOL flag2 = NO; if (flag2){ NSLog(@"%d", flag2); //0 }
//注意:try catch并不能检测所有的错误 @try { //可能出错的语句 } @catch (NSException *exception) { //异常捕获 } @finally { //一定要执行的语句 }
软件编程就是将我们的思维转变成计算机能够识别的语言的一个过程
面向对象是相对面向过程而言的
面向过程是要关注整个过程的每一步
而对象是关注对象
面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是种具有对象概念的程序编程范型,同时也是一种程序开发的方法。它可能包含数据、属性、代码与方法。对象则指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。在面向对象程序编程里,计算机程序会被设计成彼此相关的对象。
优点:
大幅度提高软件项目的成功率
减少维护成本
提高可移植性和可靠性
面向对象设计的三个主要特征
封装性
多态性
抽象性
(还有一个继承)
类(class)
在面向对象程序设计,类(英语:class)是一种面向对象计算机编程语言的构造,是创建对象的蓝图,描述了所创建的对象共同的属性和方法。
类的更严格的定义是由某种特定的元数据所组成的内聚的包。它描述了一些对象的行为规则,而这些对象就被称为该类的实例。类有接口和结构。接口描述了如何通过方法与类及其实例互操作,而结构描述了一个实例中数据如何划分为多个属性。类是与某个层(这里的层指类型层次中连接时模块依赖性相同的类的集合,即某环境下可重用性相同的组件的集合。)的对象的最具体的类型。类还可以有运行时表示形式(元对象),它为操作与类相关的元数据提供了运行时支持。
对象(object)
在计算机科学中,对象(英语:object),台湾译作物件,是一个内存地址,其中拥有值,这个地址可能有标识符指向此处。对象可以是一个变量,一个数据结构,或是一个函数。是面向对象(Object Oriented)中的术语,既表示客观世界问题空间(Namespace)中的某个具体的事物,又表示软件系统解空间中的基本元素。
如下图,图纸是类,汽车是对象
类与对象之间的关系
类(Class)一个类由3个部分构成
类的名称:类名
类的属性:一组包含数据的属性
类的方法:允许对属性中包含的数据进行操作的方法
对象(Object)
是系统中的基本运行实体
对象就是类类型(class type)的变量
定义了一个类,就可以创建这个类的多个对象
一个类是具有相同类型的对象的抽象
一般使用“名词提炼法”来提取类的抽象
1)关于类的几个名词
.h:类的声明文件,用于声明成员变量、方法。类的声明使用关键字@interface...@end
注意:.h的方法只是做一个声明,并不对方法进行实现,也就是说,只是说明一下方法名、方法的返回值类型、方法接收的参数类型而已,并不会编写方法内部的代码。
.m: 类的实现文件,用于实现.h中声明的方法,类的实现使用关键字@implementation...@end
方法
方法的声明和实现,都必须以 + 或者 - 开头
"+" 表示类方法(静态方法)
"-" 表示对象方法(动态方法)
成员变量(实例变量\属性)
成员变量的作用域有3种:
@public 全局都可以访问
@protected 只能在类内部和子类中访问
@private 只能在类的内部访问
2)类的定义分为两部分:
1)类的声明(规定当前类的:类名、属性、行为)
@interface 类名:父类名 { //定义类的属性 } //定义类的行为 @end //表示结束
2)类的实现(实现类的具体行为)
@implementation 类名 //行为的具体实现 @end
用类来创建对象,每个对象在内存中都占据一定的存储空间,每个对象都有一份属于自己的单独的成员变量,所有的对象共用类的成员方法,方法在整个内存中只有一份,类本身在内存中占据一份存储空间,类的方法存储于此。
Person类
Person.h
//Person类声明 @interface Person : NSObject { @public //公有属性 NSString *_name; int _age; } -(void)run; @end
Person.h
//Person类实现 @implementation Person -(void)run{ NSLog(@"%@正在跑", _name); } @end
创建对象及调用其方法
int main(int argc, const char * argv[]) { @autoreleasepool { //创建Person Person *person = [Person new]; person->_name = @"柯南"; //设置成员属性 person->_age = 12; NSLog(@"name->%@, age->%d", person->_name, person->_age); [person run]; //调用对象方法 } return 0; }
创建对象[Person new]时做了3件事情
1,申请内存空间
2,给实例变量初始化
3,返回空间的首地址
问题:
1、申请的空间在内存的哪个区?
new时,申请的空间在内存的堆区(动态分配的内存空间)
初始化时,如果实例变量是基本数据类型,此时初始化为0
如果是OC字符串类型,则初始化为null
2、实例变量又保存在什么地方
实例变量保存在内存中的堆区
指针变量p存放在栈区
3、对象方法保存在什么地方
-->代码区
4、为什么使用[person run];就可以调用方法了?如何调用?
先找到p对应的堆区空间-->找到_isa指针-->找到_isa指向的代码区空间-->在该空间中找到方法
【写在结尾:】
『hello, world』