OC基础--类

都是注释哈

类的组成:

  C语言中函数分为声明和实现

  OC中定义一个类也分为声明和实现, 也就是说以后我们在OC中定义类, 就是在写类的声明和实现

编写类的声明和实现:

  声明 .h:  

        /*
         行为方法:
             OC中的行为和C语言中的函数一样, 都是用来保存一段特定功能的代码
             C语言中定义一个函数, 分为声明和实现, 声明写在.h中, 实现写在.c中
             OC中定义一个方法, 也分为声明和实现, 声明写在@interface中, 实现写在@implementation
             
             C语言的函数分为两种: 内部函数和外部函数
             OC中的方法也分为两种; 类方法和对象方法
             
             类方法只能用类名调用, 对象方法只能用对象调用
             OC中的类方法用+表示, OC中的对象方法用-表示
             
             编写C语言函数的规律: 1.确定函数名称 2.确定形参 3.确定返回值 4.确定返回值类型
             编写OC方法也有规律, 规律和C语言一模一样
         
             OC中的方法, 如果没有形参不需要写(), 而是直接写一个;
             因为OC方法中的()有特殊的用途, OC方法中的()是用来扩住数据类型的
         
             OC中的方法如果有参数, 那么每个参数的数据类型前面必须加上一个:  冒号 : 也是方法名的一部分
             所以 方法名 test  与  test: 是不同的
         
             为了提高我们的阅读性, OC方法允许我们给每个参数添加一个标签来说明当前参数的含义  标签也是方法名的一部分
             - (int)sendMessageWithNumber:(int)number andContent:(char *)content;
             方法名为: sendMessageWithNumber:andContent:  这方法名就他妈一句子
         
             方法声明了必须要实现  如果声明的是对象方法那么就必须实现对象方法  如果声明的是类方法那么就必须实现类方法
         
             如果你不想每次使用方法都需要创建对象开辟存储空间  并且如果该方法中没有使用到属性(成员变量), 那么可以把这个方法定义为类方法
             类方法的实现 声明部分 除了把 - 改为 + 其他都与对象方法一样
         
             类方法和对象方法的区别
                 0. 对象方法以-开头
                 类方法以+开头
                 
                 1. 对象方法必须用对象调用
                 类方法必须用类来调用
                 
                 2. 对象方法中可以直接访问属性(成员变量)
                 类方法中不可以直接访问属性(成员变量)
                 
                 3. 类方法和对象方法可以进行相互调用
                     3.1对象方法中可以直接调用类方法
                     3.2类方法中间接调用对象方法  (注意: 不建议这样使用) (在类方法中创建对象或将对象作为参数)
                     3.3类方法中可以直接调用其它类方法
                     3.4对象方法中可以直接调用对象方法
             
             类方法的应用场景
                类方法一般用于定义工具方法
                如果方法中没有使用到属性(成员变量), 那么能用类方法就用类方法
                类方法的执行效率比对象方法高
         
             函数和方法的区别
                 1.函数属于整个文件, 方法属于某一个类 方法如果离开类就不行
                 2.函数可以直接调用, 方法必须用对象或者类来调用
                 注意: 虽然函数属于整个文件, 但是如果把函数写在类的声明中会不识别
                 3.不能把函数当做方法来调用, 也不能把方法当做函数来调用
             
             方法的注意点:
                 >方法可以没有声明只有实现
                 >方法可以只有声明没有实现, 编译不会报错, 但是运行会报错
                 如果方法只有声明没有实现, 那么运行时会报:
                 reason: ‘+[Person demo]: unrecognized selector sent to class 0x100001140‘
                 发送了一个不能识别的消息, 在Person类中没有+开头的demo方法
                 reason: ‘-[Person test]: unrecognized selector sent to instance 0x100400000‘
         */

        #import <Foundation/Foundation.h>
        /* 以@interface开头 , 以@end结尾, 然后再class name对应的地方写上类名即可
           注意: 类名的首字符必须大写
           声明一个类的目的就是为了告诉系统, 我们这个类中有哪些属性和行为
         */
        //定义一个会员类  类名后面的 :NSObject 是为了让我们的类具备创建对象的能力
        @interface Member : NSObject
        //OC类声明中属性只能在写@interface和@end之间的{}中
        {
            //成员变量的声明  编写OC类属性的时, 建议将所有属性的名称前面都加上_
            //默认情况下, OC对象中的属性是不能直接访问的 只要让类中的属性公开, 以后就可以直接通过一个指向结构体的指针来操作对象中的属性
            @public
            //会员账号
            NSString* _account;
            //会员密码
            NSString* _password;
            //余额
            double _money;
            //积分
            int _point;
        }
        //实例方法的声明
        //查看自己信息  无参无返回值
        - (void) checkInfo;
        //修改密码  有参无返回值
        - (void) changePwdWithNewPwd:(NSString*) newPwd;
        //充值 返回新余额  有参有返回值
        - (double) rechargeMoney: (double) money;
        //登陆  有参有返回值
        - (bool) loginWithAccount: (NSString*) account andPwd: (NSString*) pwd;
        //获得积分数量  无参有返回值
        - (int) getPoint;

        //类方法的声明
        //无参无返回值
        + (void) staticMethod0;
        //有参无返回值
        + (void) staticMethod1WithArg:(int) arg;
        //无参有返回值
        + (NSString*) staticMehtod2;
        //有参有返回值
        + (int) staticMethod3WithArg1: (int) arg andArg2: (NSString*) arg2;
        @end

实现 .m:  

        /*
         常见错误:
             1.只有类的声明,没有类的实现
             2.漏了@end
             3. @interface和@implementation嵌套
             4.成员变量没有写在括号里面
             5.方法的声明写在了大括号里面
             6.成员变量不能在{}中进行初始化、不能被直接拿出去访问
             7.方法不能当做函数一样调用
             8.OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在
             9.C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有
             10.C函数不能访问OC对象的成员
             11.低级错误:方法有声明,但是实现的时候写成了函数
             12.OC可以没有@interface同样可以定义一个类
         */

        #import "Member.h"
        // 类的实现  以@implementation开头, 以@end结尾, 然后在class对应的地方写上声明的类的名称, 必须和声明的类名一模一样
        @implementation Member
        //方法的实现
        - (void) checkInfo{
            NSLog(@"调用实例方法显示会员信息:");
            NSLog(@"账号:%@   密码:%@  余额:%.2lf  积分:%i", _account, _password, _money, _point);
            return;
        }

        - (void) changePwdWithNewPwd:(NSString *)newPwd{
            NSLog(@"原密码:%@", self->_password);
            self->_password = newPwd;
            NSLog(@"新密码:%@", self->_password);
            return;
        }

        - (double) rechargeMoney:(double)money{
            NSLog(@"充值前余额:%.2lf", _money);
            _money += money;
            return _money;
        }

        - (bool) loginWithAccount:(NSString *)account andPwd:(NSString *)pwd{
            //如果在对象方法中想访问该对象的属性, 可以直接写上_属性名称即可
            if (account == _account && pwd == _password) {
                return YES;
            }
            else{
                return NO;
            }
        }

        - (int) getPoint{
            return _point;
        }

        //类方法的实现
        + (void) staticMethod0{
            NSLog(@"偶是类方法  无参无返回值");
        }

        + (void) staticMethod1WithArg:(int)arg{
            NSLog(@"偶是类方法  有参无返回值");
        }

        + (NSString*) staticMehtod2{
            NSLog(@"偶是类方法  无参有返回值");
            return @" ";
        }

        + (int) staticMethod3WithArg1:(int)arg andArg2:(NSString *)arg2{
            NSLog(@"偶是类方法  有参有返回值");
            return 0;
        }
        @end

主文件main:

  

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

        int main(int argc, const char * argv[]) {
          
            /*
             创建对象:
                 在OC中想要通过一个类来创建一个对象, 必须给类发送一个消息(好比C语言中调用函数一样)
                 如何发送消息?   在OC中只要想要发送消息就先写上 [类名称/对象名称 方法名称];
                 发送什么消息(调用什么方法)可以创建一个对象呢? new
                 
                 只要通过一个类调用类的new方法, 也就是给类发送一个叫做new的消息之后 系统内部就会做3件事情
                 1. 为Iphone类创建出来得对象分配存储空间
                 2. 初始化Iphone类创建出来的对象中的属性
                 3. 返回Iphone类创建出来的对象对应的地址
             
             创建对象的时候返回的地址其实就是类的第0个属性的地址 一个叫做isa的属性 isa是一个指针, 占8个字节
             
             其实类也是一个对象, 也就意味着Person也是一个对象
             平时我们所说的创建对象其实就是通过一个 类对象 来创建一个 新的对象
             类对象是系统自动帮我们创建的, 里面保存了当前对象的所有方法
             而实例对象是程序自己手动通过new来创建的, 而实例对象中有一个isa指针就指向了创建它的那个类对象
             */
            //通过一个Member类型的指针接收了 新创建的Member对象的地址 称为Member类型的指针mem为Member对象
            //每次给Iphone类发送一个new消息都会开辟一块新的存储空间  也就意味着每次发送new消息创建出来的对象都是一个新的对象 如果修改A的属性不会影响到B的属性
            Member * mem = [Member new];
            //Member * mem = [[Member alloc] init];
            
            //访问对象的成员变量
            mem->_account = @"test";
            mem->_password = @"123";
            mem->_money = 50;
            mem->_point = 10;
            
            //实例方法的调用(发送消息) [对象名  方法名];
            [mem checkInfo];
            //[对象名  方法名: 参数];
            [mem changePwdWithNewPwd:@"321"];
            
            double money = [mem rechargeMoney:20];
            NSLog(@"充值后余额:%.2lf", money);
            
            bool login = [mem loginWithAccount:@"text" andPwd:@"123"];
            if (login) {
                NSLog(@"会员登陆成功");
            }
            else{
                NSLog(@"会员账户或密码输入错误  请重新登陆");
            }
            
            int point = [mem getPoint];
            NSLog(@"会员积分: %i", point);
            
            //类方法的调用 [类名 方法名]
            [Member staticMethod0];
            [Member staticMethod1WithArg:11];
            NSString* str = [Member staticMehtod2];
            int i = [Member staticMethod3WithArg1:21 andArg2:@"呵呵"];            
            
            return 0;
        }
        /*
         2015-08-26 22:37:06.899 OC类[628:30449] 调用实例方法显示会员信息:
         2015-08-26 22:37:06.901 OC类[628:30449] 账号:test   密码:123  余额:50.00  积分:10
         2015-08-26 22:37:06.901 OC类[628:30449] 原密码:123
         2015-08-26 22:37:06.901 OC类[628:30449] 新密码:321
         2015-08-26 22:37:06.901 OC类[628:30449] 充值前余额:50.00
         2015-08-26 22:37:06.902 OC类[628:30449] 充值后余额:20.00
         2015-08-26 22:37:06.902 OC类[628:30449] 会员账户或密码输入错误  请重新登陆
         2015-08-26 22:58:20.454 OC类[674:36997] 会员积分: 10
         2015-08-26 22:48:31.914 OC类[657:33820] 偶是类方法  无参无返回值
         2015-08-26 22:48:31.914 OC类[657:33820] 偶是类方法  有参无返回值
         2015-08-26 22:48:31.915 OC类[657:33820] 偶是类方法  无参有返回值
         2015-08-26 22:48:31.915 OC类[657:33820] 偶是类方法  有参有返回值
 */
时间: 2024-11-06 13:30:40

OC基础--类的相关文章

OC基础 类的三大特性

OC基础  类的三大特性 OC的类和JAVA一样,都有三大特性:继承,封装,多态,那么我们就来看一下OC中类的三大特性. 1.继承 继承的特点: (1)子类从父类继承了属性和方法. (2)子类独有的属性和方法不能被父类使用. (3)子类独有的属性和方法,不能够在子类之间互相使用. (4)子类能够重写父类的方法,子类调用该方法时:首先调用子类的方法,如果子类没有该方法,就调用父类的该方法. (5)子类对象指针可以转换成父类对象指针,但是父类对象指针不能够转换成子类对象指针. 三种权限变量的继承:

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

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

OC基础--类的本质

类的本质: 类的本质其实也是一个对象(类对象),只要有了类对象, 将来就可以通过类对象来创建实例对象 程序中第一次使用该类的时候被创建,在整个程序中只有一份.此后每次使用都是这个类对象,它在程序运行时一直存在. 类对象是一种数据结构,存储类的基本信息:类大小,类名称,类的版本,继承层次,以及消息与函数的映射表等 类对象代表类,Class类型,保存了当前对象所有的对象方法,当给一个实例对象发送消息的时候, 会根据实例对象中的isa指针去对应的类对象中查找 如果消息的接收者是类名,则类名代表类对象

OC基础-类的使用

#import <Foundation/Foundation.h> //定义枚举类型 typedef enum { sexMan, sexWomen } Sex;//定义日期类型typedef Struct{ int year; int month; int day;} Date; //1.声明类 (此时不能初始化类的成员变量) 2 3 @interface Student:NSObject 5 { 6 @public; 9 int age; 11 char *name; Sex enumSe

iOS开发OC基础:OC中的分类(类目)

//分类,category,(类目) //为没有源代码的类添加方法 //一定要注意,只能添加方法,不能添加实例变量 /** *  分类 类的定义也是分为接口部分和实现部分 接口部分:以@interface开头 + 类名 后跟小括号,小括号内填写的是分类名 @end结束 在@interface 与@end 之间添加方法. */ //分类为原类添加的方法,就相当于原类具有该方法,可以正常调用 因为涉及到几个分类的创建,所以就直接上传代码了,其实代码也不多,只是怕大家在建立分类的时候会混淆,所以直接把

OC基础笔记——创建类2(广州黑马一期)

// // main.m // 04-创建类2 // // Created by Apple on 14/11/17. // Copyright (c) 2014年 itcast. All rights reserved. // #import <Foundation/Foundation.h> /* 类名:Zombies 属性:life,颜色,位置,形状 行为:走,咬,死,loseLife 炮弹 类名:Cannonball 属性:大小,威力,飞行距离,速度 行为:飞,爆炸 车 类名:Car

四.OC基础--1.文档安装和方法重载,2.self和super&amp;static,3.继承和派生,4.实例变量修饰符 ,5.私有变量&amp;私有方法,6.description方法

四.OC基础--1.文档安装和方法重载, 1. 在线安装 xcode-> 系统偏好设置->DownLoads->Doucument->下载 2. 离线安装 百度xcode文档 3. 方法重载: 是指在一个类中定义多个同名的方法 在OC中没有重载 2.self和super&static, self和super: 1. self理解: 谁调用当前方法, self就代表谁. 比如: 在对象方法中,self代表的是对象, 因为只有对象才可以调用对象方法 在类方法中, self代表的

OC基础(23)

NSArray基本概念 NSArray 遍历 NSArray排序 NSArray文件读写 NSArray 与字符串 *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30p

黑马程序员--oc基础第六篇

六. oc基础知识(内存管理下) 总结:内存管理代码规范 1.只要调用alloc那么就必须调用release: 2.set方法的代码部分 *基本数据类型直接赋值. *如果是oc对象类型 - (void) setCar:(Car *)car { if(_car!=car) { [_car release]; _car=[Car retain]; } } 3.dealloc 部分的代码规范 *一定要[super dealloc ]放在最后面. *对self(当前)所拥有的其他对象做一次release