----------------------
ASP.Net+Unity开发、
.Net培训、期待与您交流! ----------------------
利用点语法替换set方法和get方法
----------------------
ASP.Net+Unity开发、
.Net培训、期待与您交流! ----------------------
利用点语法替换set方法和get方法
1.1方法调用
Student *stu = [Student new];
[stu setAge:100];
int age = [stu age];
1.2点语法
stu.age=100;
int age = stu.age;
1.3点语法的本质
其实点语法的本质还是方法调用
当使用点语法时,编译器会自动展开成相应的方法
1.4典型的错误
- (void) setAge:(int)age {
// 下面的代码会引发死循环
self.age = age;
}
- (int) age {
// 下面的代码会引发死循环
return self.age;
}
类型
@private:只能在当前类的对象方法中直接访问
@protected:可以在当前类以及子类的对象方法中直接访问
@public:任何地方都可以直接访问
@package:同一个“体系内”(框架)可以访问,介于@private和@public之间
属性
3.1@property
3.1.1用在@inteface中
用来自动生成setter和getter的声明
用@propertyintage;就可以代替下面的两行- (int)age; // getter
- (void)setAge:(int)age; // setter
3.2@synthesize
3.2.1用在@implementation中
用来自动生成setter和getter的实现
用@synthesizeage = _age;就可以代替
- (int)age{
return_age;
}
- (void)setAge:(int)age{
_age= age;
}
3.2.2@synthesize的细节
@synthesize age = _age;
setter和getter实现中会访问成员变量_age
如果成员变量_age不存在,就会自动生成一个@private的成员变量_age
@synthesize age;
setter和getter实现中会访问成员变量age
如果成员变量age不存在,就会自动生成一个@private的成员变量age
手动实现
若手动实现了setter方法,编译器就只会自动生成getter方法
若手动实现了getter方法,编译器就只会自动生成setter方法
若同时手动实现了setter和getter方法,编译器就不会自动生成不存在的成员变量
3.2.3@property新特性
自从Xcode 4.x后,@property就独揽了@synthesize的功能。也就是说,@property可以同时生成setter和getter的声明和实现
默认情况下,setter和getter方法中的实现,会去访问下划线 _ 开头的成员变量
分类
4.1格式
分类的声明
@interface 类名 (分类名称)
//方法声明
@end
分类的实现
@implemention 类名 (分类名称)
//方法实现
@end
4.2好处
一个庞大的类可以分模块开发
一个庞大的类可以由多个人来编写,更有利于团队合作
4.3使用注意
1>Category可以访问原始类的实例变量,但不能添加变量,只能添加方法。如果想添加变量,可以考虑通过继承创建子类
2>Category可以实现原始类的方法,但不推荐这么做,因为它是直接替换掉原来的方法,这么做的后果是再也不能访问原来的方法
3>多个Category中如果实现了相同的方法,只有最后一个参与编译的才会有效