------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
一、点语法概念
在Java中,我们可以通过"对象名.成员变量名"来访问对象的公共成员变量,这个就称为"点语法"。
1.传统的get方法和set方法
先来看一下传统的get方法和set方法。定义一个Student类,拥有一个成员变量age和对应的get\set方法。
1.Student.h
#import <Foundation/Foundation.h>
@interface Student : NSObject {
int age;
}
- (void)setAge:(int)newAge;
- (int)age;
@end
2.Student.m
#import "Student.h"
@implementation Student
- (void)setAge:(int)newAge {
age = newAge;
}
- (int)age {
return age;
}
@end
3.main.m
#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Student *stu = [[Student alloc] init];
// 设置age的值
[stu setAge:10];
// 取出age的值
int age = [stu age];
NSLog(@"age is %i", age);
[stu release];
}
return 0;
}
2.使用点语法代替传统的get方法和set方法
上面演示了OC传统get\set方法的简单用法,接下来使用点语法来代替。
前面main.m中main函数的代码可以改为
int main(int argc, const char * argv[])
{
@autoreleasepool {
Student *stu = [[Student alloc] init];
// 设置age的值
stu.age = 10; // 等价于[stu setAge:10];
// 取出age的值
int age = stu.age; // 等价于int age = [stu age];
NSLog(@"age is %i", age);
[stu release];
}
return 0;
}
3.注意第7行代码,把原来的[stu setAge:10]替换成了stu.age = 10。听清楚了,这两种写法是完全等价的。即这里的stu.age并不是代表直接访问stu对象的成员变量age,而是编译器遇到stu.age = 10的时候会自动将代码展开成[stu setAge:10]
再说,如果是直接访问成员变量的话,OC中应该是这样的语法:stu->age,而不是stu.age。
4.注意第10行代码,把原来的int age = [stu age]替换成了int age = stu.age。这两种写法又是完全等价的,stu.age并不是直接访问stu对象的成员变量age,而是编译器遇到int age = stu.age的时候会自动将代码展开成int age = [stu age]
5.因此,OC中点语法的含义跟Java是完全不一样的,OC点语法的本质是方法调用,不是直接访问成员变量。至于这个点语法代表的是get方法还是set方法,那就取决于你是取值还是设值,取值就是get方法(如第10行代码),设值就是set方法(如第7行代码)。
二、分类-Category
1.分类的作用
在不改变原来类内容的基础上,可以为类增加一些方法
2.使用注意:
1>分类只能增加方法,不能增加成员变量
2>分类方法实现中可以访问原来类中声明的成员变量
3>分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没法再使用
4>方法调用的优先级:分类(最后参与编译的分类优先) --> 原来类 --> 父类
3.格式
1>分类的声明
@interface 类名 (分类名称)
// 方法声明
@end
2>分类的实现
@implementation 类名 (分类名称)
// 方法实现
@end
4.好处
一个庞大的类可以分模块开发
一个庞大的类可以由多个人来编写,更有利于团队合作
5.给系统自带的类添加分类
给NSString增加一个类方法:计算某个字符串中阿拉伯数字的个数
给NSString增加一个对象方法:计算当前字符串中阿拉伯数字的个数
6.注意
Category可以访问原始类的实例变量,但不能添加变量,只能添加方法。如果想添加变量,可以考虑通过继承创建子类。
Category可以实现原始类的方法,但不推荐这么做,因为它是直接替换掉原来的方法,这么做的后果是再也不能访问原来的方法。
多个Category中如果实现了相同的方法,只有最后一个参与编译的才会有效。