美文网首页#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