美文网首页#iOS#HeminWon
iOS开发工程师学习笔记_第一周@geekband

iOS开发工程师学习笔记_第一周@geekband

作者: Andyzzy | 来源:发表于2016-05-14 22:49 被阅读0次

写在前面

第一次接触oc的编程,由于之前有java 的学习经历,并且在老师的带领下,认识了很多关于oc的学习途径对学习很有帮助。

类与对象

一、面向对象

OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能的类。

术语:OO面向对象、OOP面向对象编程

二、类和对象

(一)关于类

类的设计只关注三个东西:类名、属性和方法

注意:一般名词都是类,拥有相同属性和行为的对象都可以抽象为一个类,类名是标识符的一种,需要符合规范,通常类名的第一个字母大写,且不能有下划线,如果有多个单词则使用驼峰标识。在对方法进行类的划分中,一般采取的做法是谁最熟悉这个方法那么就把这个方法划分给谁。在OC中,对象对方法的调用称为消息机制,即向既定的对象发送了什么消息。

(二)简单内存分析

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

每个对象内部都默认有一个isa指针指向这个对象所使用的类。

[p eat];表示给p所指向的对象发送一条eat消息,调用对象的eat方法,此时对象会顺着内部的isa指针找到存储于类中的方法,执行。

isa是对象中的隐藏指针,指向创建这个对象的类。

常见错误

1.类的声明和实现不能嵌套

2.方法的实现必须放在@implementation中,不能放在@interface中。

3.方法声明不能放在大括号{}里。

4. 声明新类的时候不能和已有的类嵌套。

5.不允许在@interface大括号里给成员变量赋值(初始化),也不能随便将成员变量当作C语言中的变量来使用,如用static修饰。

6.类的声明必须放在main函数前面。

三、方法与函数

方法与函数的区别:

(1)对象方法的声明必须写在@interface和@end之间,对象方法的实现必须写在@implementation和@end之间

(2)对象方法都以-号开头,类方法都以+号开头

(3)对象方法只能由对象来调用,类方法只能由类来调用,不能当做函数一样调用

(4)函数能写在文件的任意位置(@interface和@end之间除外),函数归文件所有

(5)对象方法归类\对象所有

(6)函数调用不依赖与对象

(7)函数内部不能直接通过成员变量名访问对象的成员变量

属性和实例变量

一、类Class中的属性property

在ios第一版中:

我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如:

注意:(这个是以前的用法)

@interface MyViewController :UIViewController

{

UIButton *myButton;

}

@property (nonatomic, retain) UIButton *myButton;

@end

在现在iOS版本中:

苹果将默认编译器从GCC转换为LLVM(low level virtual machine),从此不再需要为属性声明实例变量了。如果LLVM发现一个没有匹配实例变量的属性,它将自动创建一个以下划线开头的实例变量。因此,在这个版本中,我们不再为输出口声明实例变量。

ios5更新之后,苹果是建议以以下的方式来使用:

@interface MyViewController :UIViewController

@property (nonatomic, retain) UIButton *myButton;

@end

因为编译器会自动为你生成以下划线开头的实例变量_myButton,不需要自己手动再去写实例变量。而且也不需要在.m文件中写@synthesize myButton,也会自动为你生成setter,getter方法。

@synthesize的作用:(1)让编译器为你自动生成setter与getter方法。(2)可以指定与属性对应的实例变量,例如@synthesize myButton = xxx;那么self.myButton其实是操作的实例变量xxx,而不是_myButton了。

现在:如果.m文件中写了@synthesize myButton,那么生成的实例变量就是myButton;如果没写@synthesize myButton,那么生成的实例变量就是_myButton。所以跟以前的用法还是有点细微的区别。

二、实例变量与属性变量使用方法

在MyViewController.m文件中,编译器也会自动的生成一个实例变量_myButton。那么在.m文件中可以直接的使用_myButton实例变量,也可以通过属性self.myButton.都是一样的。用self.yourButton来访问yourButton变量是不对的,Xcode会提示你使用->,改成self->yourButton就可以了。因为OC中点的表达式是表示调用yourButton方法,而上面代码没有yourButton方法,也可以直接使用yourButton。

三、类别中的属性property

类与类别中添加的属性要区分开来,因为类别中只能添加方法,不能添加实例变量。经常会在ios的代码中看到在类别中添加属性,这种情况下,是不会自动生成实例变量的。比如在:UINavigationController.h文件中会对UIViewController类进行扩展

@interface UIViewController (UINavigationControllerItem)

@property(nonatomic,readonly,retain) UINavigationItem *navigationItem;

@property(nonatomic) BOOL hidesBottomBarWhenPushed;

@property(nonatomic,readonly,retain) UINavigationController *navigationController;

@end

这里添加的属性,不会自动生成实例变量,这里添加的属性其实是添加的getter与setter方法。

注意一点,匿名类别(匿名扩展)是可以添加实例变量的,非匿名类别是不能添加实例变量的,只能添加方法,或者属性(其实也是方法)。

四、成员变量、实例变量、属性变量的联系

@interface MyViewController :UIViewControlle

{

UIButton *yourButton;

int count;

id data;

}

@property (nonatomic, strong) UIButton *myButton;

@end

在{   } 中所声明的变量都为成员变量。 所以yourButton、count、data都是成员变量。既然如此,实例变量又是什么意思呢?

实例变量本质上就是成员变量,只是实例是针对类而言,实例是指类的声明。{   }中的yourButton就是实例变量。id 是OC特有的类,本质上讲id等同于(void *)。所以id data属于实例变量。

成员变量用于类内部,无需与外界接触的变量。因为成员变量不会生成set、get方法,所以外界无法与成员变量接触。根据成员变量的私有性,为了方便访问,所以就有了属性变量。属性变量的好处就是允许让其他对象访问到该变量(因为属性创建过程中自动产生了set 和get方法)。当然,你可以设置只读或者可写等,设置方法也可自定义。所以,属性变量是用于与其他对象交互的变量。

综上所述可知:成员变量是定义在{}号中的变量,如果变量的数据类型是一个类则称这个变量为实例变量。因为实例变量是成员变量的一种特殊情况,所以实例变量也是类内部使用的,无需与外部接触的变量,这个也就是所谓的类私有变量。而属性变量是用于与其他对象交互的变量。

但是,现在大家似乎都不怎么喜欢用成员变量来定义类的变量,都喜欢用属性变量来定义类的变量。把需要与外部接触的变量定义在.h文件中,只在本类中使用的变量定义在.m文件中。

方法

方法是Objective-C独有的一种结构,只能在Objective-C中声明、定义和使用,C语言不能声明、定义和使用。

1、类方法以+号开头,对象方法以-号开头

+ (void) init;        // 类方法

- (void) show;                // 对象方法

2、在@interface和@end之间声明,在@implementation和@end之间定义

@interface Test : NSObject

// 方法声明

+ (void) init;

- (void) show;

@end

@implementation Test

// 方法实现

+ (void) init

{

}

- (void) show

{

}

@end

3、类方法只能由类来调用,对象方法只能由方法来调用

// 调用类方法

[Test init];

// 调用对象方法

Test *t = [Test new];

[t show];

4、方法归类、对象所有。

5、方法声明和实现中用到的数据类型必须用()括住。

函数:函数即C语言中的函数,在C和Objective-C中都声明、定义和使用。

1、函数能写在文件中的任意位置(@interface和@end之间除外),函数归文件所有。

int add(int num1, int num2)

{

return num1 + num2;

}

2、函数调用不依赖于对象。

int sum = add(1, 2);

3、函数内部不能直接通过成员变量名访问某个对象的成员变量。

初始化器和析构器

初始化器:init

对象初始化器: -(id)init 可以重载多个。

类型初始化器: +(id)initialize只能有一个。

对象初始化器:

初始化对象实例时,init通常和alloc(手动内存分配)搭配使用。

alloc所做的事情——NSObject已实现。

·在堆上分配合适大小的内存。

·将属性或者实例变量的内存置0。

init所做的事情——可以自定义:

·调用父类初始化器[super init](前置调用)

·初始化当前对象的实例变量(注意是实例变量,不是属性)

new 相当于调用alloc/init的无参数版本。

·Book* book = [Book new];

类初始化器:一般用的很少

比如说类里有一个全局的静态变量,就需要在类初始化的时候赋个初值。

initialize在每个类使用之前被系统自动调用,且只调用一次(每个进程周期)。

子类的initialize会自动调用父类的initialize(前置调用)。

析构器:dealloc(也叫释放器)

释放对象所拥有的资源,无返回值的函数。

只有对象析构器,没有类型析构器。

自动实现:1.ARC将对象属性引用计数减持。

手动实现:2. 释放不受ARC管理的动态内存,如malloc分配的内存。

手动实现:3. 关闭非内存资源,如文件句柄,网络接口。。。

dealloc由ARC根据对象引用计数规则,在释放对象内存前自动调用,无法手动调用。

子类的dealloc会自动调用父类的dealloc(后置调用)。

继承和多态

1、继承

继承的好处:

创建大量的相似类的时候,可以节省工作量。

使用框架中的类,或已经写好的类,继承该类,生成一个派生类,比原类更好用。

重写(继承的另一部分)

子类可以从父类继承方法,但是有时候父类的方法不适合子类,子类就可以写一个自己的同名方法,覆盖掉父类的同名方法,叫做重写。

重写的时候,在子类的.h中不必重新声明,直接在.m中写实现就可以。

2、多态

多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态。

在使用多态是,会进行动态检测,以调用真实的对象方法。

多态在代码中的体现即父类指针指向子类对象。(*)

参考资料:

http://www.cnblogs.com/xiaodong208/p/4233025.html

http://www.cnblogs.com/FightingLuoYin/p/4341340.html

http://www.bkjia.com/IOSjc/1126149.html

相关文章

网友评论

    本文标题:iOS开发工程师学习笔记_第一周@geekband

    本文链接:https://www.haomeiwen.com/subject/ynryrttx.html