你好, 世界

--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 对象的存储细节
----------------------------
 
 

【写在开头:】

关于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 动态链接

--1-- Xcode创建OC项目

1.1 OC命令行项目

使用Xcode快速创建项目:

1)选择项目类型

2)填写相应的项目信息

创建完成-->

--2-- NSLog函数和@符号

2.1 NSLog的介绍

NSLog是cocoa的框架中提供的一个方法,定义在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是一个字符串指针

2.2 NSLog使用方法

        int a = ;
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不支持

2.3 NS前缀的含义

NSArray,NSString等NS前缀的类、函数归属于cocoa Fundation基础类库,其"NS”的由来据说是这样的:乔布斯被苹果开除后,创立了NeSt公司,而cocoa Fundation基础类库就是出自于NeST公司,NeST中的"NS"被作为Fundation中所有成员的前缀。

2.4 @符号

在OC中"@"符号有特殊的用途

1)@""; 这个符号表示将一个C的字符串转化为OC中的字符串对象NSString

2)@标识符  OC中大部分的关键字都是以@开头的,比如@interface,@imlementation,@end,@class等。

--3-- OC和C差异学习

3.1 源文件对比

C语言中常见的后缀是:

  .c .o .out  .h .m

在OC中常见的文件有两种:.h和.m的文件

扩展名

源类型

.h

头文件,头文件包含方法,属性的声明。

.m

类的实现文件,参与编译的文件,用来实现类中声明的方法

3.2 基本语法对比

1)数据类型对比学习

2)变量的定义对比

3)流程控制语句对比

新增:增强型for循环,可以快速遍历数组、字典等集合

3.3 OC新增的数据类型介绍

逻辑型

  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);  //
    }

  2)BOOL也是存放逻辑值的另外一种方法

  BOOL //它的取值是YES和NO

  YES   1 真

  NO   0 假

 BOOL flag2 = NO;

 if (flag2){

 NSLog(@"%d", flag2); //

 }

3.4 OC中的新增异常捕获方法

        //注意:try  catch并不能检测所有的错误
@try {
//可能出错的语句
}
@catch (NSException *exception) {
//异常捕获
}
@finally {
//一定要执行的语句
}

--4-- 面向对象

4.1 编程的实质

软件编程就是将我们的思维转变成计算机能够识别的语言的一个过程。

4.2 面向对象的基本概念

面向对象是相对面向过程而言的

面向过程是要关注整个过程的每一步

而对象是关注对象所具有的行为和属性。

面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是种具有对象概念的程序编程范型,同时也是一种程序开发的方法。它可能包含数据、属性、代码与方法。对象则指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。在面向对象程序编程里,计算机程序会被设计成彼此相关的对象。

优点:

大幅度提高软件项目的成功率

减少维护成本

提高可移植性和可靠性

面向对象设计的三个主要特征

封装性

多态性

抽象性

(还有一个继承)

--5-- 类和对象

5.1 类和对象

类(class)

在面向对象程序设计,类(英语:class)是一种面向对象计算机编程语言的构造,是创建对象的蓝图,描述了所创建的对象共同的属性和方法。

类的更严格的定义是由某种特定的元数据所组成的内聚的包。它描述了一些对象的行为规则,而这些对象就被称为该类的实例。类有接口和结构。接口描述了如何通过方法与类及其实例互操作,而结构描述了一个实例中数据如何划分为多个属性。类是与某个层(这里的层指类型层次中连接时模块依赖性相同的类的集合,即某环境下可重用性相同的组件的集合。)的对象的最具体的类型。类还可以有运行时表示形式(元对象),它为操作与类相关的元数据提供了运行时支持。

对象(object)

在计算机科学中,对象(英语:object),台湾译作物件,是一个内存地址,其中拥有值,这个地址可能有标识符指向此处。对象可以是一个变量,一个数据结构,或是一个函数。是面向对象(Object Oriented)中的术语,既表示客观世界问题空间(Namespace)中的某个具体的事物,又表示软件系统解空间中的基本元素。

如下图中,图纸是类,汽车就是对象

类与对象之间的关系

类(Class)一个类由3个部分构成

  类的名称:类名

  类的属性:一组包含数据的属性

  类的方法:允许对属性中包含的数据进行操作的方法

对象(Object)

  是系统中的基本运行实体

  对象就是类类型(class type)的变量

  定义了一个类,就可以创建这个类的多个对象

一个类是具有相同类型的对象的抽象

一般使用“名词提炼法”来提取类的抽象

5.2 类的声明和实现

1)关于类的几个名词

.h:类的声明文件,用于声明成员变量、方法。类的声明使用关键字@interface...@end

  注意:.h的方法只是做一个声明,并不对方法进行实现,也就是说,只是说明一下方法名、方法的返回值类型、方法接收的参数类型而已,并不会编写方法内部的代码。

.m: 类的实现文件,用于实现.h中声明的方法,类的实现使用关键字@implementation...@end

方法

方法的声明和实现,都必须以 + 或者 - 开头

  "+" 表示类方法(静态方法)

  "-"  表示对象方法(动态方法)

成员变量(实例变量\属性)

成员变量的作用域有3种:

  @public 全局都可以访问

  @protected 只能在类内部和子类中访问

  @private 只能在类的内部访问

2)类的定义分为两部分:

  1)类的声明(声明当前类的类名、属性、行为)

@interface 类名:父类名
{
//定义类的属性
} //定义类的行为 @end //表示结束

  2)类的实现(实现类的具体行为)

@implementation 类名

    //行为的具体实现

@end

5.3 对象的存储细节

用类来创建对象,每个对象在内存中都占据一定的存储空间,每个对象都有一份属于自己的单独的成员变量,所有的对象共用类的成员方法,方法在整个内存中只有一份,类本身在内存中占据一份存储空间,类的方法存储于此。

Person类

Person.h

//Person类声明
@interface Person : NSObject
{
    @public //公有属性
    NSString *_name;
    int _age;
}
-(void)run; @end

Person.m

//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 = ;
        
        NSLog(@"name->%@, age->%d", person->_name, person->_age);
        [person run]; //调用对象方法
    }
return ;
}

创建对象[Person new]时做了3件事情:

1,申请内存空间

2,给实例变量初始化

3,返回空间的首地址

问题:

1、申请的空间在内存的哪个区?

new时,申请的空间在内存的堆区(动态分配的内存空间)

初始化时,如果实例变量是基本数据类型,此时初始化为0

如果是OC字符串类型,则初始化为null

2、实例变量又保存在什么地方

实例变量保存在内存中的堆区

指针变量p存放在栈区

3、对象方法保存在什么地方

-->代码区

4、为什么使用[person run];就可以调用方法了?如何调用?

先找到p对应的堆区空间-->找到_isa指针-->找到_isa指向的代码区空间-->在该空间中找到方法

【写在结尾:】

『hello, world』

OC-hello, world的更多相关文章

  1. iOS代码规范(OC和Swift)

    下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...

  2. 用C语言封装OC对象(耐心阅读,非常重要)

    用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...

  3. 嵌入式&iOS:回调函数(C)与block(OC)传 参/函数 对比

    C的回调函数: callBack.h 1).声明一个doSomeThingCount函数,参数为一个(无返回值,1个int参数的)函数. void DSTCount(void(*CallBack)(i ...

  4. 嵌入式&iOS:回调函数(C)与block(OC)回调对比

    学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...

  5. WebViewJavascriptBridge源码探究--看OC和JS交互过程

    今天把实现OC代码和JS代码交互的第三方库WebViewJavascriptBridge源码看了下,oc调用js方法我们是知道的,系统提供了stringByEvaluatingJavaScriptFr ...

  6. OC泛型

    OC泛型 泛型是程序设计语言的一种特性,他主要是为了限制类型的,比如OC中的数组,你可以限制他里面装的是NSString类型,泛型的话JAVA和C++都有的,大家要是对泛型不了解的话可以去百度一下. ...

  7. iOS学习15之OC集合

    1.数组类 1> 回顾C语言数组 数组是一个有序的集合, 来存储相同数据类型的元素. 通过下标访问数组中的元素,下标从 0 开始. 2> 数组 数组是一个有序的集合,OC中的数组只能存储对 ...

  8. JS 与OC 交互篇

    完美记录交互 CSDN博客: (OC调用JS) http://blog.csdn.net/lwjok2007/article/details/47058101 (JS调用OC) http://blog ...

  9. OC中加载html5调用html方法和修改HTML5内容

    1.利用webView控件加载本地html5或者网络上html5 2.设置控制器为webView的代理,遵守协议 3.实现代理方法webViewDidFinishLoad: 4.在代理方法中进行操作H ...

  10. iOS开发--JS调用原生OC篇

    JS调用原生OC篇 方式一(反正我不用) 第一种方式是用JS发起一个假的URL请求,然后利用UIWebView的代理方法拦截这次请求,然后再做相应的处理. 我写了一个简单的HTML网页和一个btn点击 ...

随机推荐

  1. 关于Hibernate 5 和 Hibernate 4 在创建SessionFactory的不同点分析(解决 org.hibernate.MappingException: Unknown entity: xx类报错问题)

    Hibernate4版本的SessionFactory实例构建的步骤是这样的(也是很多学习资料的通用范本): //Configuration就是代表着hibernate的那个xml配置文件对象,如果c ...

  2. TabSiPlus发布1749版本

    拖了几天,终于可以发布了,下载地址如下: http://www.winmsg.com/download/TabSiPlus_0_99b2_1749.rar 这个包里没有附带VC的运行库,考虑到大多数人 ...

  3. argparse解析参数模块

    一.简介: argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块.argparse模块的作用是用于解析命令行参数,例如python parseTes ...

  4. WebApi接口传参不再困惑(4):传参详解(转载)

    WebApi接口传参不再困惑(4):传参详解   前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料.如今,使用WebApi也有段时间了,今天就记录下API接口传参的一些方 ...

  5. ActionListener的三种实现方法

    Swing是目前Java中不可缺少的窗口工具组,是用户建立图形化用户界面(GUI)程序的 强大工具.Java Swing组件自动产生各种事件来响应用户行为.如当用户点击按钮或选择菜单项目时,Swing ...

  6. es6 ajax

    简单的co用例: var co=require("co") class view{ constructor(){ co(function*(){ var p1=this.ajax1 ...

  7. visual studio2015从git上clone(克隆)项目

    本文介绍Visual Studio2015从git上clone项目代码的步骤. 1.打开VS2015,进到起始页,打开"团队资源管理器",如下图: 2.点击"克隆&quo ...

  8. iOS超全开源框架、项目和学习资料汇总(5)AppleWatch、经典博客、三方开源总结篇

    完整项目 v2ex – v2ex 的客户端,新闻.论坛.apps-ios-wikipedia – apps-ios-wikipedia 客户端.jetstream-ios – 一款 Uber 的 MV ...

  9. 就publish/subscribe功能看redis集群模式下的队列技术(一)

    Redis 简介 Redis 是完全开源免费的,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中 ...

  10. cordova IOS源码浅析

    cordova封装了一套js和OC通信的代码,cordova.js下的iOSExex是关键的js去调原生的发起点. function iOSExec() { var successCallback, ...