学习Objective-C

1. Objective-C与其他语言的区别?

我们知道Objective-C语言是有Smalltalk演化过来的,Smalltalk又他妈是消息语言的鼻祖,可想而之Objective-C又有什么样的特性,Smalltalk的精髓是消息结构叫做message structure的东西,而C++, java 等语言使用函数调用的方式(function call),也许不是很明白,也许你已经很透彻,但是我还是要举个列子说明一下。

拿C++来说吧, 我们调用一个类名为Object字为function的函数通常会这样做.

Object *obj = new object();
obj->function();

而在Objective-C中是这种方式

Object *obj = [[Object alloc] init];
[obj function];

上述两种方式出了语法不一样外,他们机制也有很大的区别,首先说C++ 如果函数function 是多态的,那么程序运行的时候,就会产生一张虚表,简单的说虚表吧,就是一张表,呵呵,它保存着自己的虚函数地址,同样派生类也会产生一张虚表,如果派生类中实现了基类的虚方法的时候,派生类的函数地址纪录的就是自己的函数地址,否则还是基类的,于是呼,当调用function的时候它会查自己的虚表找出function的函数地址进行调用,这是C++中调用原理。下面说下Objective-C中的方式,在OC中调用function的时候,那么它会给这个对象发一个function的消息,要理解的是只有运行的时候该对象才接受接受到这个消息进行调用,和编译器半毛钱的关系都没有,如果找不到这个方法就会爆出异常,OC中这种机制叫做动态绑定。在Effective 高质量编程这本书中说过这样一句话对于消息结构的语言,其运行时所执行的代码由运行环境来决定,而函数调用的语言由编译器来决定。后边我会补充动态绑定的原理,这里就不多说了。

2.Objective-C中对象内存的分配

码奴们都很清楚程序运行时,变量的空间分配
静态区:保存自动全局变量和static 变量(包括static 全局和局部变量)。静态区的内容在总个程序的生命周期内都存在,由编译器在编译的时候分配。
栈:保存局部变量。栈上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁。
堆:由malloc 系列函数或new 操作符分配的内存。其生命周期由free 或delete 决定

那么Objective-C有个引用计数以后,粗俗的来讲,可以理解含有*对象都是在堆上,这里先记下,我会在引用计数原理详细的说明。

3.头文件的引用

Objective-C较语言加入了#import,而C语言中的#include同样可以使用,#import比起#include的好处就是不会引起交叉编译。因此建议使用#import这种方式。

4.第一个Objective-C程序

windows下编程我们经常用VS,那么我们写OC程序的时候用的是Xcode一个强大的到爆的ide工具。
先了解一下xcode的吧,我选用的是xcode版本6.3.1

xcode启动页
我们选择第二项Create a new Xcode project,至于其他两项干什么的先不需要了解,后面会说到。

这里写图片描述

可以看到左边的菜单有两项IOS和IOX,IOS就是移动应用,IOX是Mac X下的应用程序,这里由于我门需要学习一些基本数据类型,选择OSX 下面的 Command Line Tool,就像我们学C语言的hello word
这里写图片描述

Product Name 顾名思义产品名字也就是工程的名字,下面两项是组织的名字,在公司开发的时候一般一般填写公司名字和域名反转bundle identifer是程序的标示,它会根据orgianization identifier和工程名自动生成,会在app store上线的时候用到。

好的那么创建好之后就会自动生成helloword 程序

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
    }
    return 0;
}

那么我们C语言的helloword 是什么样子的呢

#include<stdio.h>

int main(int argc, const char * argv[]) 
{
    printf("hello word");
    return 0;
}

是不是很像,第一章就说了Objective-C是C语言面向对象的扩充,
区别就是头文件和main 函数主题有点区别
OC 里面有个框架叫做Foundation框架,在第一章我门已经说过IOS程序的分层,那么这个Foundation就在Core Services 这一层,OC中含有大量的对象和数据结构,在Foundation中定义了大量我们日常用的数据结构,于是就引用和Foundation的头文件

@autoreleasepool {
        // insert code here...
    }

那么上面这个代码块是干什么用的呢,我们称它为自动释放池,有了引用计数之后,我们不需要去考虑管理内存的事,它的功能就是延迟释放,说白了就是保证对象用的时候可以用,不用的时候自动给你释放,这里会在附录中的引用计数原理的详细的讲到。那么以后写代码只需要写在这个代码块里面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值