Snail—OC学习之类及对象

对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型

面向对象的编程语言都是有类及对象的

类是由属性及方法组成。

OC中的所有官方类及自定义的类都是NSObject的直接或者间接子类

下面看看类的编写规范

首先,COMMAND+N 新建一个类 Dog类

看到会生成两个文件.h和.m

.h是对属性及方法的声明,.m是对方法实现.

Dog.h文件中编写如下

#import <Foundation/Foundation.h>

@interface Dog : NSObject{
    //名字的变量 类型是字符串
    NSString *_name;
    //性别暂时用int值代替 1代表公 0代表母
    int _sex;

}

// 前面是+号,即此函数是Dog类的方法 可以直接用Dog类名来调用
// 无需创建对象就可以调用,简化代码
//另一个作用就是用来创建单例,即在整个生命周期,无论创建多少次都是同一个对象
+ (instancetype)sharedDog;

// 前面是-号的叫做对象方法
//默认的无参构造函数  如果不写 也是会存在的默认构造函数
- (instancetype)init;
//带一个参数的构造函数
- (instancetype)initWithName:(NSString *)name;
//带两个参数的构造函数
- (instancetype)initWithName:(NSString *)name AndSex:(int)sex;

//对象变量name、sex的get及set方法
- (void)setName:(NSString *)name;
- (NSString *)name;
- (void)setSex:(int)sex;
- (int)sex;

// 狗的一个行为
// bark(叫) 返回值为void空,无参
- (void)bark;

//lookHome(看家)无参
- (void)lookHome;

@end

Dog.m代码编写如下

#import "Dog.h"

@implementation Dog

// 由此可见,利用Dog类名来调用这个方法时 无论创建多少次对象都是同一个dog
+ (instancetype)sharedDog{
    static Dog * dog;
    if (dog != nil) {
        dog = [[Dog alloc] init];
    }
    return dog;
}

//init开头的方法都是初始化构造函数 一种编码规范
// init是没有参数的默认写法
- (instancetype)init{
    if (self = [super init]) {
    }
    return self;
}

//这是具有一个参数的初始化构造函数
- (instancetype)initWithName:(NSString *)name{
    if (self = [super init]) {
        _name = name;
    }
    return self;
}

//具有两个参数的构造函数
- (instancetype)initWithName:(NSString *)name AndSex:(int)sex{
    if (self = [super init]) {
        _name = name;
        _sex = sex;
    }
    return self;
}

- (void)setName:(NSString *)name{
    _name = name;
}

- (void)setSex:(int)sex{
    _sex = sex;
}

- (int)sex{
    return _sex;
}

- (NSString *)name{
    return _name;
}

//叫得方法 实现
- (void)bark{
    //在类的方法中可以访问成员变量,也可以赋值
    _name = @"刀刀";
    NSLog(@"%@在叫!",_name);
}

- (void)lookHome{
    _sex = 1;
    NSLog(@"刀刀狗是个%d的",_sex);
}

@end

main函数引入头文件后创建几个对象

#import <Foundation/Foundation.h>
#import "Dog.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        Dog * dog1 = [Dog sharedDog];
        [dog1 setName:@"刀刀"];
        [dog1 setSex:1];
        //%p可以打印出对象的地址 0x100106800
        NSLog(@"%p",dog1);
        Dog * dog2 = [Dog sharedDog];
        //0x100106800  dog2的地址和dog1的地址一样 即是同一个对象
        NSLog(@"%p",dog2);

        //当我们在main函数即相对于Dog类来说的外界函数 我们无法调用self.name的 我们通过set/get来对变量进行赋值或者获取

        // alloc 是在堆空间开辟一块空间 然后init初始化对象
        Dog * dog3 = [[Dog alloc] init];
        //下面赋值可以这样写 dog3.name = @"汪星人";
        //原理就是此语句调用的下面这个方法 调用了 -(void)setName:(NSString *)name;
        [dog3 setName:@"汪星人"];
        //下面dog3.name 的作用跟 [dog name]一样
        //其实前者这样写的原理就是调用了后者 调用了(NSString *)name方法
        NSString * name = dog3.name;
        NSLog(@"%@",name);
        //dog3调用直接的bark(叫)的方法
        [dog3 bark];

        //有参的初始化方法
        Dog * dog4 = [[Dog alloc] initWithName:@"大黄" AndSex:8];
        NSLog(@"我是%@",dog4.name);

    }
    return 0;
}

下面,来介绍一个知识点,即property属性修饰

改写一下Dog类

首先,Dog.h中 改写成下面这样

#import <Foundation/Foundation.h>

@interface Dog : NSObject{

}

@property NSString * name;
@property int sex;

// 前面是+号,即此函数是Dog类的方法 可以直接用Dog类名来调用
// 无需创建对象就可以调用,简化代码
//另一个作用就是用来创建单例,即在整个生命周期,无论创建多少次都是同一个对象
+ (instancetype)sharedDog;

// 前面是-号的叫做对象方法
//默认的无参构造函数  如果不写 也是会存在的默认构造函数
- (instancetype)init;
//带一个参数的构造函数
- (instancetype)initWithName:(NSString *)name;
//带两个参数的构造函数
- (instancetype)initWithName:(NSString *)name AndSex:(int)sex;

// 狗的一个行为
// bark(叫) 返回值为void空,无参
- (void)bark;

//lookHome(看家)无参
- (void)lookHome;

@end

Dog.m文件中

#import "Dog.h"

@implementation Dog

// 由此可见,利用Dog类名来调用这个方法时 无论创建多少次对象都是同一个dog
+ (instancetype)sharedDog{
    static Dog * dog;
    if (dog == nil) {
        dog = [[Dog alloc] init];
    }
    return dog;
}

//init开头的方法都是初始化构造函数 一种编码规范
// init是没有参数的默认写法
- (instancetype)init{
    if (self = [super init]) {
    }
    return self;
}

//这是具有一个参数的初始化构造函数
- (instancetype)initWithName:(NSString *)name{
    if (self = [super init]) {
        name = name;
    }
    return self;
}

//具有两个参数的构造函数
- (instancetype)initWithName:(NSString *)name AndSex:(int)sex{
    if (self = [super init]) {
        self.name = name;
        self.sex = sex;
    }
    return self;
}

//叫得方法 实现
- (void)bark{
    //在类的方法中可以访问成员变量,也可以赋值
    self.name = @"刀刀";
    NSLog(@"%@在叫!",_name);
}

- (void)lookHome{
    self.sex = 1;
    NSLog(@"刀刀狗是个%d的",_sex);
}

@end

可以看出来 变量、及变量的get/set方法代码删除后, 利用property来修饰的属性 再执行main.m文件时 没有报错 即property自动为我们生成了set/get方法

这就是一个自定义的类。此类是直接继承于NSObject父类的(@interface Dog : NSObject),下一篇会说继承

一个标准的自定义类就是这样来写,具体遇到问题遇到什么需求可以适当的做些改变

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 07-19

Snail—OC学习之类及对象的相关文章

OC学习01-类和对象

面向对象编程 基本: 概念:对象 类 封装 多态 主要语言有 C++,Java,OC 面向过程与面向对象的区别 面向过程 面向对象 特点 分析步骤,实现函数 分析问题找出参与并得出对象及其作用 侧重 实现功能 对象的设计(具体指功能) 例子 C语言 OC,C++,java 基本代码: // OC打印 NSLog(@"Lanou"); // NSInteger 整型,CGFloat 浮点型,NSString 字符串 NSInteger i = 100; NSLog(@"i =

OC学习之类与对象

1.面向过程与面向对象. 1). 完成需求1 将大象放进冰箱. a. 把冰箱门打开. b. 把大象放进去. c. 把冰箱门关上. 这是面向过程的思路. 找1个冰箱,要求这个冰箱可以自己开门,自己把大象放进去,自己关门. 解决同1个问题的两种思路. 1). 解决这个问题的每1个步骤,都是我自己亲自去实现. 像这样的解决问题的思路,我们叫做面向过程的解决思路. 2). 自己不要去亲自做,而是找1个专门做这个事情的人来帮我做.像这样的解决问题的思路,我们叫做面向对象的解决思路. 面向过程与面向对象是解

Snail—OC学习之文件操作(非读写)

#import <Foundation/Foundation.h> //宏定义一个文件夹的路径信息 #define path @"/Users/XXX/Desktop/Snail" //宏定义一个文件的路径 #define filePath @"/Users/XXX/Desktop/Snail/Snail3/Snail.txt" int main(int argc, const char * argv[]) { @autoreleasepool { //

Snail—OC学习之继承

继承在字面意思就是继承财产等等.就是儿子继承父亲的财产也好.各种东西.当然儿子也可以有父亲没有的其他东西.父亲也可以不让儿子继承一些东西 上面是说的现实生活中得例子. 所谓继承,是指一个对象直接使用另一对象的属性和方法.面向对象的变成语言都有继承 OC所有的官方类或者自定义类的直接父类及间接父类都是NSObjetc类 版权声明:本文为博主原创文章,未经博主允许不得转载.

Snail—OC学习之可变字符串NSMutableString

NSMutableString 继承于NSString 所以NSSting的所有方法NSMutableString都继承 并且也可以用 下面有两个方法NSString没有的 <span style="font-size:14px;">//长度为0 同样表示空的字符串 NSMutableString * str3 = [[NSMutableString alloc] initWithCapacity:0];</span> <span style="

OC学习篇之---总结和学习目录

今天终于把OC的基础知识学习完了,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.下面就是这次学习OC的目录教程,如果大家发现有什么不正确的地方,请指正,小弟是新生,多请OC老鸟来喷~~ 1.OC学习篇之---概述 2.OC学习篇之---第一个程序HelloWorld 3.OC学习篇之---类的定义 4.OC学习篇之---类的初始化方法和点语法的使用 5.OC学习篇之---类的三大特性(封装,继承,多态) 6.OC学习篇之[email protected]关键

OC学习篇之---单例模式

在之前的一片文章中介绍了对象的拷贝相关知识:http://blog.csdn.net/jiangwei0910410003/article/details/41926531,今天我们来看一下OC中的单例模式,单例模式在设计模式中用的可能是最多的一种了,而且也是最简单的一种 实现单例模式有三个条件 1.类的构造方法是私有的 2.类提供一个类方法用于产生对象 3.类中有一个私有的自己对象 针对于这三个条件,OC中都是可以做到的 1.类的构造方法是私有的 我们只需要重写allocWithZone方法,

黑马程序员-OC学习笔记之Foundation框架NSNumber、NSValue和NSDate

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.NSNumber 前几篇笔记中,小桥复习了Foundatio框架中的几个类,这三个是OC学习的尾声了. 小桥已经复习过OC数组类NSArray,也说过它只能存放OC的对象,对于基本的数据类型确无能为力,但是实际编程中经常要把基本的数据如int.float,结构体存放的OC数组中,怎么办?这里的NSNumber就有用了,它能够把基本数据类型包装成OC对象.

Python学习笔记_Python对象

Python学习笔记_Python对象 Python对象 标准类型 其他内建类型 类型对象和type类型对象 Python的Null对象None 标准类型操作符 对象值的比较 对象身份比较 布尔类型 标准类型的内建函数 typeObj cmpobj1 obj2 strobj reprobj typeobj isinstanceobj 标准类型的分类 存储模型 更新模型 访问模型 不支持的类型 Python学习笔记_Python对象 首先来理解一个通俗的含义,什么是对象?其实对象无论在什么语言里面