• ios开发之OC基础-类和对象


    本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点。建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再将零散的知识点整理出来。这样的学习方法会带来更多的收获,同时要多做练习,按照思路,默写、改写代码。在这里,感谢欧阳坚老师,学习你的课程使我走上了ios的开发之路。

    一定要明确一个要从事的方向,要不然就会感到迷茫。学习ios开发,并且从事ios开发这个行业,这就是我的选择。看到我的博客系列文章,其中大多是关于C++、Qt、Linux网络编程、OpenGL、Unity3D等方面。从表面上看和ios开发似乎没有多少关联,但是有了这些方面的学习经验给我带了一定的基础。ios开发主要用oc和swift语言,而oc是从事ios开发的基础。众所周知,oc(objective-c)即面向对象的C,在C语言的基础上增加了面向对象的机制和内存管理这一对翅膀,使得OC在做ios开发如虎添翼。

    本系列文章仅供个人学习和分享给志同道合的猿友,不存在商业用途。

    OC是一门面向对象的语言,既然是面向对象就少补了类和对象。我们知道在C++中面向对象的三大机制:继承、封装、多态,这在OC中也同样具备。下面就具体说一下OC中的类和对象。

    类的定义

    类是由属性和方法组成的,属性表示类的特征,方法表示类的动作。

    类的定义格式

    OC中的类定义和C++中的类定义有些不同,在OC中类的头文件为***.h,而源文件却是以.m为后缀的文件-***.m。

    接口在头文件中:

    @interface 类名:基类名称{
         //属性名称
    }//这里不加";"号
         //方法声明
    @end//声明结束

    类名首字母需要大写,NSObject是OC所有类的基类,接口中只包含方法的声明,方法有类方法和实例方法。

    实现在源文件中:

    @implementation 类名
    //方法实现
    @end

    类的访问权限

    有三种访问权限:@public,@private,@protected。属性默认的权限是保护类型,方法默认的权限是公有类型。

    OC中的构造函数以initWith***开头,主要做一些初始化工作,析构函数为dealloc,如果自己写类没有定义,系统会自动提供一个默认的构造函数和析构函数。

    举个例子说明一下,如下代码:

    -(id) init{
        self = [super init];
        //使用super父类对象,self表示本类对象
        if(self){
            
            NSLog(@“在构造函数中name %@ age%d %s”,_name,_age,_FUNCTION_);
        }
        return self;
    }
    
    -(id)initWithName:(NSString *)newName{
        
    }
    
    -(id)initWithName:(NSString*)newName withAge:(int) newAge{
    }
    -(void)dealloc{
        //析构函数在对象完全消失的时候调用
        //对象销毁时调用,对象计数器=0
        //dealloc不要手动调用[person dealloc],应该调用[person release];
        //release销毁对象,release计数器减一,减到0就自动调用dealloc。
        [super dealloc];
    }

    在OC中也可以使用"obj->arrt"的形式访问和设置属性字段,但前提是该字段必须被声明为公有类型。但是这种方式不建议使用。

    #import<Foundation/Foundation.h>
    @interface Person:NSObject{
    @public
        int _age;
        NSString *_name;
    }
    -(void) setAge:(int)age;
    -(int)getAge;
    @end
    @implementation Person
    -(void) setAge (int)age{
        _age = age;
    }
    
    -(int)getAge{
        return _age;
    }
    @end
    
    int main()
    {
        @autoreleasepool{
            Person *person = [[Person alloc] init];
            person->age = 20;
            person->name = @”小红”;
        }
        return 0;
    }

    Person *person = [[Person alloc] init]就是person指向的对象分配了内存空间,并进行了初始化。也可以用Person *person = [Person new],OC中也支持new运算符。因为age、name字段被声明为public类型,所以可以使用指针调用的方式来设置对象的属性。

    参数标签

    -(Person *)init:(int) newID:(int) newAge;//没有使用参数标签
    
    -(Person *)initWithID:(int) newID andAge:(int) newAge;//使用参数标签

    第一个参数可以不带标签,从第二个参数开始可以带标签。现在的方法名为:initWithID:andAge:,参数标签可以提高方法名的可读性,同时还可以用于方法的重载。

    方法重载

    在OC中,方法的重载不像C++那样可以通过,参数类型,参数个数进行区分了。OC中不是严格的函数重载。

    //方法名相同并且参数个数相同但参数类型不同,在OC中构不成方法重载
    -(int) doSth:(int) x;
    -(int) doSth:(float) x;
    
    -(int) doSth:(int) x:(int) y;
    -(int) doSth:(float) x:(float) y;
    
    //用参数标签可以构成方法重载
    -(int) doSth:(int) x:(int) y;
    -(int) doSth:(float) x andY:(float) y;
  • 相关阅读:
    Response
    servelt乱码问题(tomcat服务端编码为ISO-8859-1)
    Servlet中的常用类以及常用方法
    EKF优化:协方差coff计算公式、意义、Code优化
    使用std::cout不能输出显示
    SLAM: Inverse Depth Parametrization for Monocular SALM
    SLAM: 单目视觉SLAM的方案分类《机器人手册》
    SLAM: SLAM的发展历程(WIKI)
    SLAM: VSLAM扫盲之旅
    安卓系统使用摄像头API
  • 原文地址:https://www.cnblogs.com/tgycoder/p/5569424.html
Copyright © 2020-2023  润新知