iOS开发之oc--类与对象(2)-set/get方法及构造方法

面向对象的特征:

1)封装  2)继承 3)多态

知识点:

(1)set/get方法(成员变量的封装)

(2)构造方法

(3)self的使用

(4)对象方法和类方法

小知识点补充

(一)set/get方法

【set】:用形参给成员变量赋值

【get】:返回成员变量的值

代码示例

#import <Foundation/Foundation.h>

// 声明
@interface Car : NSObject
{
    //@public
    // 以后的成员变量最好不要写@public,
    // 因为@public修饰的成员变量可以被别人乱改

     int _wheels; // 轮子个数 

// 成员变量的命名规范

    // 成员变量都以下划线 _ 开头
    // 1.可以跟get方法的名称区分开
    // 2.一看到下划线开头的变量,肯定是成员变量

/*
 set方法
 1.作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值
 2.命名规范:
   1> 方法都是以set开头,而且后面跟上成员变量名,成员变量名的首字母必须大写
   2> 形参名称不要跟成员变量同名
3.因为只是提供方法设置值,所以,返回值为void
 */
- (void) setWheels:(int)newWheels;

/*
 get方法
 1.作用:返回对象内部的成员变量
 2.命名规范:
   1> get方法的名称一般就跟成员变量同名
3.因为get方法是要取得成员变量的值,所以返回值类型,和成员变量类型相同
 */
- (int) wheels;

// 跑
- (void) run;

@end

@implementation Car

// 跑的实现
- (void) run
{
    NSLog(@"%i个轮子的车跑起来了!", wheels);
}

// set方法的实现
- (void) setWheels:(int)newWheels
{
    // 对外面传进来的轮子数进行过滤(当我们需要过滤数据时)
    if (newWheels<=0)
    {
        newWheels = 1;
    }

    _wheels = newWheels;  //  一般就写这一句就行了
}

// get方法的实现
- (int) wheels
{
    return _wheels;
}

@end

int main()
{
    Car *car = [Car new];
    // car->wheels = -10;      当@public时,才能使用此方法直接设置值
    // 通过set方法设置Car对象的_wheels成员变量
    [car setWheels:-100];

    [car run];  

     //  [car wheels]通过get方法获得Car对象的_wheels成员变量
    NSLog(@"轮子个数:%i", [car wheels]);

    return 0;
}

补充

// 多个
-(void)setAge:(int)a AndWeight:(int)w AndHeight:(int)h
{
//方法一:直接给成员变量赋值

//    _age = a;
//    _weight = w;
//    _height = h;
//方法二:封装成员变量的setter 方法
    [self setAge:a];    //self ==  wangcai
    [self setWeight:w];
    [self setHeight:h];

}

(二)构造方法(初始化对象)

1.构造方法有两种

(1)系统提供的默认的构造方法

(2)自定义的构造方法

2.

>在一般语言创建对象或者变量的时候系统自动去调用的方法叫做构造方法(这个概念了解就行,重点在下面)

遗憾的是OC在创建对象的时候不会自动调用构造方法

>构造方法的作用:在创建对象的时候对对象的成员变量做初始化

>OC中,凡是以init开头的方法 都是构造方法

>构造方法分为无参构造方法,和带参的构造方法

一个类可以有多个构造方法,在创建对象的时候根据需求去选择调用构造方法

3.1【无参构造方法】

声明的格式  :-(当前类 类型的指针 *)init;

实现的格式:

-(Dog *)init{

self = [super init];

if (self != nil) {

_name = @"Tom";

_age = 0;

}

return self;

}

【注】:一个完整的对象分为父类和当前类两部分,初始化的时候要

1)先去通过super 关键字先去初始化父类这一部分,把初始化父类操作的返回值赋值给self

2)去判断初始化父类时候的返回值,如果返回值不为空说明父类初始化成功,去初始化当前类特有的成员变量

3)返回self

3.2【带参构造方法】

实际上就是带个参数~~ so easy ~~参照set方法的带多参

3.3【对象的初始化顺序】

1)先去通过super 关键字先去初始化父类这一部分,把初始化父类操作的返回值赋值给self

2)去判断初始化父类时候的返回值,如果返回值不为空说明父类初始化成功,去初始化当前类特有的成员变量

======

(三)self的使用

1)

self:接受消息的对象或类,当前对象的指针 (指向 方法调用者)。   注意: 在类方法中,self一定指向类

super:接受消息的对象的父类,用于调用父类的成员方法。

出现的地方:所有的OC方法中(对象方法\类方法),不能出现在函数

 2)作用

1> 使用 "self->成员变量名" 访问当前方法调用的成员变量

2> 使用 "[self 方法名];" 来调用方法(对象方法\类方法)

代码示例:

/*
 self
 1.使用场合:只能用在方法(对象方法\类方法),不能用在函数中
 2.每次调用方法的时候,系统会自动创建self指针
 3.self指针指向方法调用者
 */

#import <Foundation/Foundation.h>

@interface Car : NSObject
{
    int _wheels;
}

- (void)setWheels:(int)wheels;
- (int)wheels;

- (void)run;

@end

@implementation Car

// 所有的成员变量(不管是不是@public),都能直接在对象方法中访问

- (void) setWheels:(int)wheels
{
    self->_wheels = wheels;
}

- (int) wheels
{
    return self->_wheels;
}

- (void) run
{
    // self是一个特殊的指针,只在@implementation的方法中才有
    // self其实是方法中一个内置指针,每次调用方法,都会有self这个指针
    // self指针指向方法调用者
    int _wheels = 10;

    // 利用self指针访问方法调用的成员变量_wheels
    NSLog(@"%i个轮子的车子飞奔起来了!", self->_wheels);
}

/*
 错误写法:self不能用在函数中
void test()
{
    self->_wheels = 10;
}
 */

@end

int main()
{
    Car *c = [Car new];
    [c setWheels:4];

    [c run];

    return 0;
}

(四)对象方法和类方法

 >对象方法

1)以减号-开头

2)只能让对象调用,没有对象,这个方法根本不可能被执行

3)对象方法能访问实例变量(成员变量)

 >类方法

1)以加号+开头

2)只能用类名调用(通过类名直接调用),对象不能调用

3)类方法中不能访问实例变量(成员变量)

4)使用场合:当不需要访问成员变量的时候,尽量用类方法

注意: 类方法和对象方法可以同名;实例变量_xxx不能在类方法中访问。

>【类方法的三个作用】

1:简单快速的创建对象

2:如果一个功能是由多个方法协同完成的,用 类方法可以留出一个简单易用的接口

3:实现单例模式

===============

  

小知识点补充:

(1)

nil:如果要把对象赋值为空 用nil

Nil :如果要把基本数据类型赋值为空  用Nil

void * :可以指向任何数据类型的变量

 id类型: 可以引用任何类实例化的对象  ,在给所引用的对象发消息时不需要强转

【self和super关键字】

self:接受消息的对象或类,当前对象的指针 (通过那个对象使用到self,self 就是谁)。

super:接受消息的对象的父类,用于调用父类的成员方法。

(2)对象的内存表示

//父类的成员变量

//父类的成员方法

//自身的成员变量

//自身的成员方法

(3)复合对象

用面向对象的思想把大象装进冰箱

对象          成员变量                          成员函数                                                           类

象         age/weight/height      setter/getter                                                  Elephant

箱        Elephant * ele                  opendoor/storeelephant/closedor       Haier

 

时间: 2024-10-26 12:24:45

iOS开发之oc--类与对象(2)-set/get方法及构造方法的相关文章

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

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

iOS开发之oc(回顾笔记)--类与对象(1)

理论是枯燥的,所以有点长.哈哈哈~ 要学习一门语言,我们首先得了解它,那么 [什么是OC] objectiv-c  简称 OC,是一门基于C语言为基础编写而成的面向对象的语言.完全兼容C语言:可以在OC代码中混入C语言代码,甚至是C++代码: 可以使用OC开发Mac OS X平台和iOS平台的应用程序. (一)首先,先了解一下面向过程和面向对象: [面向过程] 1.面向过程的语言所有语句都是祈使句  2.面向过程的语言是数学逻辑的映射 3.面向过程语言的程序 = 数据 + 算法 C语言就是一门面

李洪强iOS开发之OC[018]对象和方法之间的关系

// //  main.m //  18 - 对象和方法之间的关系 // //  Created by vic fan on 16/7/14. //  Copyright © 2016年 李洪强. All rights reserved. // /** * OC有参有返回值的方法 有参有返回值方法的声明 - (int)sum:(int)x andY:(int)y; - (int)sum:(int)x andY:(int)y{ return x+y; 关系: 1 对象作为方法的参数; 显示人的信息

李洪强iOS开发之OC语言类的深入和分类

OC语言类的深入和分类 一.分类 (一)分类的基本知识  概念:Category  分类是OC特有的语言,依赖于类. 分类的作用:在不改变原来的类内容的基础上,为类增加一些方法. 添加一个分类: 文件结构图: 在分类中添加一个方法 Study方法的实现 测试程序: (二)分类的使用注意 (1)分类只能增加方法(包括类方法和对象方法),不能增加成员变量 (2)在分类方法的实现中可以访问原来类中的成员变量: (3)分类中可以重新实现原来类中的方法,但是会覆盖掉原来的方法,导致原来的方法无法再使用(警

李洪强iOS开发之OC语言基础知识

OC语言基础知识 一.面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能的类. 术语:OO面向对象.OOP面向对象编程   二.类 (一)关于类 类的设计只关注三个东西:类名.属性和方法 注意:一般名词都是类,拥有相同属性和行为的对象都可以抽象为一个类,类名是标识符的一种,需要符合规范,通常类名的第一个字母大写,且不能有下划线,如果有多个单词则使用驼峰标识.在对方法进行

李洪强iOS开发之OC语言description方法和sel

OC语言description方法和sel 一.description方法 Description方法包括类方法和对象方法.(NSObject类所包含) (一)基本知识 -description(对象方法) 使用NSLog和@%输出某个对象时,会调用对象的description方法,并拿到返回值进行输出. +description(类方法) 使用NSLog和@%输出某个对象时,会调用类对象的description方法,并拿到返回值进行输出,把整个对象一次性打印出来,打印对象使用%@. 使用@%打

李洪强iOS开发之OC语言构造方法

OC语言构造方法 一.构造方法 (一)构造方法的调用 完整的创建一个可用的对象:Person *p=[Person new]; New方法的内部会分别调用两个方法来完成2件事情,1)使用alloc方法来分配存储空间(返回分配的对象):2)使用init方法来对对象进行初始化. 可以把new方法拆开如下: 1.调用类方法+alloc分配存储空间,返回未经初始化的对象 Person *p1=[person  alloc]; 2.调用对象方法-init进行初始化,返回对象本身 Person *p2=[p

李洪强iOS开发之OC常见错误汇总

// //  main.m //  16 - 常见错误汇总 // //  Created by vic fan on 16/7/13. //  Copyright © 2016年 李洪强. All rights reserved. // OC的常见错误汇总: 1 @interface ... @end  和 @implementation ..@end 之间不能嵌套 2只有类的声明没有类的实现 3 漏写@end 4 两个类的声明顺序可以打乱,但是类的声明一定要在类的实现前面 5 成员变量没有放在

iOS开发之oc(十)--类的本质、description、SEL

(一)类的本质 1.类也是个对象 其实类也是一个对象,是Class类型,简称“类对象”. // Class类型的定义 typedef struct objc_class *Class; // 类名就代表着类对象,每个类只有一个类对象 2.+load和+initialize +load >  在程序启动的时候会加载所有的类和分类,并调用所有类和分类的+load方法 >先加载父类,再加载子类:也就是先调用父类的+load,再调用子类的+load >先加载元原始类,再加载分类 >不管程序

iOS开发之oc(九)--Category-分类

需求:如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 >继承 >分类(Category) (一)了解Catagory 1. Catagory,可以动态的为已经存在的类添加新的行为(方法),功能扩展,使用Category对类进行扩展时,不需要创建子类. Category使用简单的方式,实现了类的相关方法的模块化,把不同的类方法分配到不同的分类文件中 category(分类.类别.类目)--(用来功能分类,分工,利于开发,一般以功能命名) 2.示例 //声明 @interface 类