iOS 基础 第一天(0804)
OC对象的本质就是一个结构体
为什么说是个结构体?
例如:类里面声明了几个成员变量\实例变量(已添加@plublic),外部对象的指针在访问这个变量的时候是这么写的p->a
0804
注意oc的全称拼写:Objective-C
Mac终端Terminal的一些命令
- cd 切换目录
- touch 新建一个.m文件
- open 打开一个.m文件
- cc -c ...m编译.m文件,生成.o文件。不会检查方法的合法性
- cc ...o链接.o文件,生成一个a.out程序。检测方法是否存在及其合法性。如果是c语言,则自动会把c语言的头文件搞进来,但oc的不会,需要手动导入.例如:cc ....o -framework Foundation(注意大小写). cc命令也可以直接链接.m文件。这样就是编译链接一起搞。
- ./a.out 运行程序
- clear 清屏
- mkdir 创建一个文件夹
- 如果是多个.o文件关联的话,需要在链接的时候一起链接,如果缺少oc框架还需要手动导入.例如:cc one.o two.o -framewirk Foundation
下面是具体的情况
NSLog输出的内容会自动换行
#import有两个作用
- 跟#include一样,拷贝文件内容
- 可以自动防止文件的内容被重复拷贝。例如导入同一个头文件多次,只在第一次生效,多写的那部分无效.
使用一个框架只需要将其的主头文件.h导入即可.主头文件的名称和框架的名称一样.例如:#import<Foundation/Foundation.h>
面向过程和面向对象的区别
- 面向过程关注的是解决问题的步骤
- 面向对象关注的是解决问题需要哪些对象
以修电脑为例:面向过程是要知道怎么修电脑,第一步干什么第二步干什么等等。而面向对象就是直接去找修电脑的人,这个人就是一个对象。面向对象不用关心这个修电脑的人怎么修的,面向过程就要知道怎么修电脑.
类和对象
- 类是抽象的,是对对象属性和方法的概括和描述
- 对象是具体的,对象是类的一个实例
类名和函数名第一个字母大写.方法名和变量名第一个字母小写.
函数和类
- 完整的写一个函数:函数的声明和定义(实现)
- 完整的写一个类:类的声明和实现
如果一个类具备创建对象的能力,则该类需要继承自NSObject
1、类的声明,用来声明对象的属性和方法
@interface Car : NSObject
{
在这中间写的是成员变量\实例变量.如果不加@public的话,外界是不能通过对象指针p->访问的.链接会报错
-
不允许在这里初始化成员变量 (和C语言的区别)
-
不可用static来修饰 (和C语言的区别)
-
有的时候要把一些成员变量\实例变量直接写在打括号里面的一个原因就是,这样访问成员变量\实例变量可以直接访问,而不需要强制有个对象才能访问.写起来更方便些.但我不提倡这么写,不规范.还是用@property来声明,用self.变量来访问比较好.注意:age=10和self->age=10相同. self.age和[self age]相同. age=10才是是指成员变量本身.这个在循环强引用导致内存泄露的时候有讲法
-
不加@public可以起到一个保护作用。不让外界的对象直接访问到该成员变量修改值,但可以通过对象方法来实现修改,比如[self setAge:0].所以尽量不要加@plublic
-
只要在这里写成员变量一定要加下划线_ ,只要在这里加成员变量没有加下划线的就是没理解@property和成员变量的关系
}
@end
问题现象如下图:
一般都这么写:
2、类的实现
@implementation Car
#end
oc中的括号()有两个用途
- 用来括住数据类型
- 用来将int、float或者double的c语言类型的变量的值转换为oc对象的NSNumber
每个对象内部都会有一个isa指针,这个指针指向了对象所属的类.这个指针大小是8个字节。(这个isa指针实际上是NSObject的一个成员变量)而对每个类来说,每个类里面都有一个superClass指针,指向自己的父类
如下图所示:
从上图可以看出,成员变量是属于对象的,对象内存里除了isa指针就是成员变量.但方法是属于类的,对象可以共用类里面的方法
一个可能的面试题:试着从内存的角度解释一个对象是如何知道自己有哪些成员变量有哪些对象方法的
答:一个类在实例化一个对象的时候就为其在内存中分配了内存地址及内存空间。对象的内存空间里包含两部分,一个是isa指针,一个是对象的成员变量.成员变量是属于对象的,在分配内存的时候就将对象所具有的变量分配到的对象内存中.这样对象就知道了自己有哪些成员变量.而isa指针8个字节,指向了对象所属的类,方法是属于类的.通过isa指针对象就知道了自己有哪些对象方法可以执行.
方法和函数的区别
- 方法都是以减号-或者加号+开头
- 方法都要在@interface和#end之间,即要写在类的声明里 方的实现必须写在@implementation和@end之间。即写在类的实现里。
- 方法只能由对象或者类来调用。函数可以脱离对象存在,但必须在类中。所以在函数中不能调用对象的成员变量。
- 函数能写在文件中的任意位置,函数归文件所有。注意按照C语言的存放规则和调用规则。即直接调用函数名则需要把函数写在调用位置的前面。如果要写在调用位置的下面,则需要用void 函数名()的方式来调用。