C++【Objective-C 篇】 ☞ 1. 基础、语法

1. 第一个OC程序

框架(Framework)

和C的Hello不同:

1) 扩展名(后缀名)为.m

2) 使用Foundation框架

3) 使用#import导入头文件:

#import <Foundation/Foundation.h>

#import 会自动处理头文件还导入问题。

4) 使用NSLog函数输出日志信息

5) 使用clang编译器,并且总是Foundation框架:

clang -framework
Foundation xxxx.m (编译时一旦留意指定Foundation框架)

 

每当Unix/Linux/苹果系统下可执行文件的晚缀名可以是任何文件,可以是任意后缀名或从不后缀。

如果,a.out==》a.txt (都得实施!)

小结一个文本扩展名(后缀名):

.c ===》C语言源程序文件

.m ===》OC

.cpp ===》C++

.cc ===》某些Unix系统的C++

.mm ===》Objective C++

 

.s ===》汇编

.i ===》经过预处理后底源程序

.o ===》编译还无连的二进制文件

.o、.out (c、c++、Objective-C语言编译后生成的文本)

 

.a ===》静态库文件

.so ===》Unix/Linux下的动态库文件

.dylib ===》Mac OS/iOS 动态库文件

2. 编译器

C语言标准编译器是: gcc   OC早期的编译器使用gcc  (gcc不是苹果公司之)

OC现在之编译器:

clang (苹果商店自己支付的,独立的编译器)

LLVM(小之一个言语虚拟机)集成在Xcode中【特点:随时编译,方便Xcode自动随时检查语法错误】

C语言编译器:gcc

OC语言的编译器:clang (由于OC语言兼容所有的C语言语法,所以啊可就此clang编译器编译C程序)

3. Xcode写OC程序

  

  只待以C语言字符串前面加上@符号,
系统便见面自动将C语言字符串转换为OC字符串。

4. 面向对象编程

4.0 定义

面向对象编程: 直接用解决现实生活中问题之计来缓解计算机问题。

4.1 对象

Anything is Object 万物皆对象,现实中,对象是同栽客观上的存在。

程序中目标是一样切开内存空间,这片空间受到存放表示对象的多少。

靶:类这种类型的变量

目标被产生:

有什么      属性

克干啊   方法

 

4.1.1 系统面临的目标:

一个靶来或由若干单小目标成

靶职能单一,一个对象就做要好欠做的从业

靶等齐心协力,各直所能够

目标和对象之间有一定联系,之间用发消息的法展开工作

这些针对象构建成一个运行的系。

 

4.1.2 %@打印一个对象(实例对象/类对象):

一经采取%@打印某个对象, 系统之中默认就会见调用父类的description方法

打印对象的本色是:打印description方法被之字符串!

    

4.1.3 匿名对象

起名字的靶子:只要用一个指南针保存了某对象的地方,
我们就算足以称此指针也某某对象(称p为TRPerson的目标)

TRPerson *p = [TRPerson new];

p.name = @"张三";

p.age = 22;

[p show];

从没名字的对象

无论有没有发生名字, 只要调用new方法都见面回对象的地址

历次new都见面新开发一块存储空间

[TRPerson new].name = @"张三";

[TRPerson new].age = 22;

[[TRPerson new] show];

4.2 类

恍如是项目的意,现实中凡是相同种植主观的认

于计算机中,类是打定义类型,是创建对象的范(模板)

看似即用来描述对象的共性特征,主要用以描述对象的属性与表现

类吃起:属性之概念和措施的定义

4.2.1 类的本来面目:类其实呢是一个目标(类对象),这个目标会以此近乎第一涂鸦被采用的早晚创建。

  • 要出矣仿佛对象,
    将来就足以经过类似对象来创造实例对象
  • 实例对象被产生一个isa指针,
    指向创造自己的类似对象
  • 接近对象被保存了即目标具备的对象方法
  • 当让一个实例对象发送信息之上,会因实例对象被的isa指针去相应之好像对象吃追寻

类似对象代表类,class类型,对象方法属于类对象

要是消息的收信人是类名,则类名代表类对象

所有类的实例都是因为接近对象生成,类对象会拿实例的isa的价修改成温馨之地方,每个实例的isa都凭借于该实例的接近对象。

 

4.2.2 如何赢得取类对象?

Class c = [类名/实例对象 class];

 

好像对象的下场景:

  • 用于创造实例对象

TRPerson *p3 = [c1 new];

TRPerson *p4 = [[c3 alloc]init];

  • 用来调用类方法

[c3 method];//等价于[TRPerson
method];

 

4.2.3 类的启航过程(系统里头自行调用的点滴只点子:load方法 和 initialize方法)

  • load方法:程序一样启动就会调用
    • 假定程序启动就会见拿所有类的代码加载到外存中, 放到代码区
    • load方法会在当前好像吃加载到内存的早晚调用, 有还仅会调用一不行
    • 要有继续关系, 会先调用父类的load方法, 再调用子类的load方法
  • initialize方法:
    • 当类第一次等受应用的时节便见面调用(创建类对象的早晚)
    • initialize方法以一切程序的运转过程遭到只是会叫调用一破, 无论你利用多少次是近乎都止见面调用一潮
    • initialize用于对某一个像样进行一次性的初始化
    • initialize和load一样, 如果存在继续关系, 会先调用父类的initialize再调用子类的initialize

   

4.3 在OC中定义类和创建对象

4.3.1 定义一个看似

划分点儿组成部分:接口部分,实现部分

1、接口部分

声明类的目的: 告诉系统我们这个近乎吃有哪些性与艺术

@interface  类名 : 父类名   //类开始

//定义属性

//声明方法(相当于声明函数)

@end   //类结束

  1. 落实部分

@implementation 类名

//方法的定义(相当于定义函数)

@end

 

4.3.2 创建对象

创建对象使用alloc,创建好后用一个指南针将对象的地点保存起来,以便后面使用。我们拿保存对象地址的指针叫引用(Reference)

类名 *引用名 = [类名
alloc];

经过类似创建对象

1) 开辟存储空间,通过alloc(new)方法创建对象会于积内存中开辟一片存储空间

2) 初始化所有属性

3) 返回指针地址

创建对象的当儿回来的地址其实就是是接近的第0单属性之地点

然急需专注的凡: 类的第0只属性并无是咱们编辑的第一个属性,而是一个称呼isa的性能(isa是一个指南针, 占8独字节)

isa属性是系里自行帮助我们抬高的,当您创造一个目标的时候,系统自动生成isa属性

isa是一个指针,占8单字节

isa的来意:会指向创建是看似的生看似

     

实质上看似为是一个对象,也就意味着MyClass也是一个靶(类对象)

     平时我们所说之创建对象其实就算是由此一个
类对象 来创造一个 新的实例对象

     类对象是系自动帮助咱创建的,里面保存了时目标的所有方

     而实例对象是次自己手动通过alloc(new)来创造的,而实例对象吃生一个isa指针就对准了创造它的要命看似对象

 

4.3.2 对象的囤积细节

接近创建对象,每个对象在内存中还占有一定之贮存空间,每个对象还起同一份属于自己之独门的成员变量,所有的目标同用类的分子方法。

方以所有内存中单独来同卖,类本身在内存中占一份储存空间。

OC中对象创建

TRPerson *p = [TRPerson new];// 等价于 TRPerson *p = [[TRPerson alloc]init];

怎么理解这句话:

理解1:定义了一个TRPerson类型的指针变量,指针变量指向新申请的内存空间

理解2:用TRPerson类实例化了(创建了)一个实例对象,对象的名称是p

这里的new做了三件事:

  1. 向计算机申请内存空间
  2. 给类中的每一个成员赋初值
  3. 返回新申请的空间的首地址

    

  

    

4.4 定义属性

1) 在接口部分概念属性:

@property int x;

@property double y;

@property NSString *name; //对象只能通过引用访问,所以要加*(指针类型)

//NSString是OC中的字符串类型,*name代表一个指针,OC语言中字符串类型是一个对象,只能用一个指针来保存一个对象的地址,而不能直接保存一个对象;所有的对象都一样,不能直接用变量来保存对象,只能用一个指针来保存对象的地址!MyClass *obj = [MyClass alloc];

@property NSString *name;//姓名

@property int age;//年龄

@property BOOL gender;//性别

@property double salary;//工资

 

2) 访问对象中之性:

引用.属性 = 值;

NSLog(@”%d”, 引用.属性);

// %@打印字符串对象

NSLog(@“姓名: %@,性别: %@“, self.name,self.gender?@”男”:@”女”);

 

4.5 声明与定义方法

1) 在接口部分声明方法

  • (返回值类型)方法名;   

  • (返回值类型)方法名:参数表;

2) 在促成部分定义方法

  • (返回值类型)方法名 {

//写现实的贯彻代码 

}

//在OC中方法名会被分解成若干个部分分散在多个参数的前面。

//此方法的方法名是:"setName: age: gender: salary:"

– (void)setName:(NSString *)name

            age:(int)age

          gender:(BOOL)gender

          salary:(double)salary;

3) 调用

经过对象来调用方法

[引用 消息]; //向引用指向的对象发消息(消息的名应该是办法名),如果引用指向的目标来跟此信息名字如出一辙的法门,就见面自动调用此措施。如果没有此法,程序崩溃。

4.6 实际开支中类的写法

实在支出中,类的接口部分和落实部分是分离的,接口部分在头文件中,实现有放在.m文件中

类似名加前缀,防止命名冲突(苹果官方的前缀是零星个字母,为了不跟法定的复,开发者一般用3独字母之前缀)

5. 方法(Method)

5.1 概念

实质是函数,在OC中描绘法与函数不同。

当艺术被好看属性。

当一个对象吸收一个消息不时,调用对应之办法。

5.2 分类:

实例方法(instance method): –

类方法(class method): +

在.h中声称的装有办法作用域都是public类型,不克改变。

5.3 实例方法(instance method)

实例(instance)指的是目标。一个近乎的目标足以给称作是看似的一个实例。

非得经过对象来调用的办法吃实例方法。具体的吧是由此对对象的援来调用。

5.4 实例方法的参数

任凭参、一个参数、多只参数

5.5 方法的返回值

暨函数一样

输出一个对象详细信息的星星种办法:

     

5.6 函数和章程C++的分

1) 函数属于通文件,
方法属于有一个看似,方法而离开类就格外

2) 函数可以一直调用,
方法必须用对象或类来调用

3) 不克将函数当做方法来调用,
也无能够拿法当做函数来调用

 

6. 分子变量、实例变量(instance variable)

6.1 概念

实例就是目标

每个对象(实例)都起同一份好特有之数据以及别的对象不同,这些异常之数会保存在对象的部分非常变量中,这些变量就是实例变量。

列一个实例都有一样客特别之实例变量。实例变量用来记录以及保留数据!

 

有人吗被成员变量

C++  member variable  成员变量

member function  成员函数

6.2 定义成员变量(在OC里也于实例变量)

//在大括如泣如诉丁宣称的变量都也成员变量

{

    UIButton *_button;

    int age;

    id data;

}

 

成员变量的常用作用域有3栽:

  1. @public 全局都可以看
  2. @protected 只能当接近里及子类中访问
  3. @private 只能在看似里访问

 

6.3 实例变量和性质的涉及

性之真面目:两计(setter和getter)+ 实例变量

当我们当相近中定义一个特性时,编译器会扭转以下内容:

1) 保存属性值的实例变量,名字呢”_属性名”

2) 修改实例变量值的setter方法,名字啊”set属性名”,并且属性名的首字母大写

3) 读取实例变量值的getter方法,名字吧”属性名”

按照,定义之性名叫name,生成的实例变量名也”_name”,生成的setter方法的名字为:”setName:”,生成的getter方法的讳也:”name”

 

岂拜实例变量?

当实例方法外(类中),可以直接访问实例变量。(如:_age=22;)

于实例方法外(类外部),用以下简单栽艺术访:

    1)用->直接进行走访;

如:f->_name = @“张三”;  f->_age = 20; (一般不要!)

假使利用,要用@public公开实例变量(实例变量默认是于保障之:@protect),才能够因此->访问

    2)用智间接访问(setter/getter),属性是造访实例变量的平等栽办法。

(setter方法可以为实例变量赋值,getter方法可以落实例变量的值。)

 

6.4 实际开发被的更:

相似情况下,很少会定义实例变量,而会大量底概念属性。

每当头文件被,尽量不要定义实例变量,而是定义属性。

 

OC中的实例变量相当于java中之成员变量,OC中时用实例变量来抱多少。

 

偶尔我们会于.m文件被定义实例变量,保存有个体的数额。也就是说在implementation中定义。

.h文件被的凡堂而皇之之,.m文件是私房的:

在.h文件被定义的性能(实例变量)是明白的,在.m文件被定义之习性(实例变量)是私有的。

在.h文件中声明与在.m文件被实现的方法是公然之,只在.m文件被落实,未在.h文件宣称的主意是私家的。