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 ;
}
@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 = @"";
mem->_money = ;
mem->_point = ;
//实例方法的调用(发送消息) [对象名 方法名];
[mem checkInfo];
//[对象名 方法名: 参数];
[mem changePwdWithNewPwd:@""];
double money = [mem rechargeMoney:];
NSLog(@"充值后余额:%.2lf", money);
bool login = [mem loginWithAccount:@"text" andPwd:@""];
if (login) {
NSLog(@"会员登陆成功");
}
else{
NSLog(@"会员账户或密码输入错误 请重新登陆");
}
int point = [mem getPoint];
NSLog(@"会员积分: %i", point);
//类方法的调用 [类名 方法名]
[Member staticMethod0];
[Member staticMethod1WithArg:];
NSString* str = [Member staticMehtod2];
int i = [Member staticMethod3WithArg1: andArg2:@"呵呵"];
return ;
}
/*
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] 偶是类方法 有参有返回值
*/
OC基础--类的更多相关文章
- OC基础 类的三大特性
OC基础 类的三大特性 OC的类和JAVA一样,都有三大特性:继承,封装,多态,那么我们就来看一下OC中类的三大特性. 1.继承 继承的特点: (1)子类从父类继承了属性和方法. (2)子类独有的属 ...
- ios开发之OC基础-类和对象
本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...
- OC基础:类和对象 分类: ios学习 OC 2015-06-12 18:55 17人阅读 评论(0) 收藏
OC:Objective-c 面向对象的c语言,简称obj-c或者OC OC和C的区别 1.OC是C语言的超集,OC是在C语言的基础上结合smalltalk的优点,开发出来的语言.oc兼容所有 ...
- OC基础--类的本质
类的本质: 类的本质其实也是一个对象(类对象),只要有了类对象, 将来就可以通过类对象来创建实例对象 程序中第一次使用该类的时候被创建,在整个程序中只有一份.此后每次使用都是这个类对象,它在程序运行时 ...
- OC基础:类的扩展.协议 分类: ios学习 OC 2015-06-22 19:22 34人阅读 评论(0) 收藏
//再设计一个类的时候,有些方法需要对外公开(接口),有些仅供内部使用. 类的扩展:为类添加新的特征(属性)或者方法 对已知类: 1.直接添加 2.继承(在其子类中添加实例变量和方法) 3.使用ext ...
- OC基础4:类和方法
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.类的声明(@interface)要放在 ...
- 五.OC基础--1.多态,2.类对象,3.点语法,4.@property&@synthesize,5.动态类型,内省(判断对象是否遵循特定的协议,以及是否可以响应特定的消息)
五.OC基础--1.多态, 1. 多态概念,定义:多态就是某一类事物的多种形态: 表现形式: Animal *ani = [Dog new]; 多态条件:1.有继承关系 2.有方法的重写 2.多态代码 ...
- 【OC基础语法考试】
OC基础语法已经全部学完,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.接下来我会总结前面的OC基础语法,如果大家发现有什么不正确的地方,请指正,小弟是新生,多请 ...
- iOS 阶段学习第11天笔记(OC基础知识)
iOS学习(OC语言)知识点整理 一.OC基础知识 1)#import 用于导入头文件,预处理阶段加载引用,只加载一次. 2)OC 依赖于Foundation框架下的头文件Foundation.h, ...
随机推荐
- 使用AppCan实现分享网站功能
使用AppCan实现分享网站功能 昨天我们实现了最基本的文字分享功能,今天呢,我们来实现基本的分享网站功能: 微信指引部分这里不再复述,具体请参见:http://newdocx.appcan.cn/i ...
- 鸟哥的linux私房菜学习记录之系统设定工具与硬件检测
这部分没啥用,就不记录了,关于服务器的在服务器篇
- top free综合监控工具
top选项: -d:指定刷新时间间隔 -n:指定刷新次数 -u:指定只显示user用户的进程信息 -p:指定只显示pid的进程信息 [root@linuxzgf ~]# top Mem: 817449 ...
- tomcat 内存溢出解决办法
- Entity Framework 第八篇 结构优化
在之前的文章里,业务层直接调用一个包装的仓储类入口,忽略了DAL层,在业务层绕过DAL直接调用仓储类似乎也没什么大的问题,但是这样做有一个很大的弊端,就是无法做到DAL层的原子操作的复用.假如多个业务 ...
- -webkit-transform:scale(1.04)放大缩小效果
<p>[鼠标移动进去图片放大一倍效果:运用了-webkit-transform:scale(1.04)效果]</p> 如图:鼠标移动上去的时候图片放大一倍的效果, <!D ...
- 监控流量shell脚本
# vi /etc/rc.d/traffic_monitor.sh---------------------------------------------- #!/bin/bash PATH=/bi ...
- 【leetcode❤python】 396. Rotate Function
#-*- coding: UTF-8 -*- #超时# lenA=len(A)# maxSum=[]# count=0# while count ...
- js给文本框赋值 value与innerHTML
<input type="test" name="testName" id="testId"> 赋值操作: <script ...
- Web1.0、Web2.0、Web3.0的主要区别
Web1.0:以静态.单向阅读为主,网站内信息可以直接和其他网站信息进行交互,能通过第三方信息平台同时对多家网站信息进行整合使用. Web2.0:以分享为特征的实时网络,用户在互联网上拥有自己的数据, ...