一:对象方法和类方法
对象方法:
1)'-' 开头
2)可以访问实例变量
3)可以调用类方法
4)可以调用自己和其他对象的方法(调用其他对象方法,要作为参数传递过来)
5)由对象调用
类方法:
1)'+' 开头
2)不可以访问实例变量
在一个类方法中不能访问实例变量,因为实例变量还没有分配内存,初始化,也可以说还没有实例变量,原因是还没有对象
3)类方法可以调用其他的类方法
4)类方法不可以用对象调用
5)类方法,可以调用对象方法(把对象作为方法参数传递过来)
6)类方法中不可以再调用当前方法(死循环)
例如Person类调用自己的类方法reach
+ (void) reach;
{
[Person reach];
}
[Person reach]; // 死循环
注意:对象方法和类方法可以同名
二:匿名类的使用
1> 匿名类的第一种用法:
Person *p = [Person new];
//创建一个车的对象
//显示的使用对象
Car *car1 = [Car new];
car1->_color=1;
//人开车回家
[p goHome:[Car new]]; //匿名的使用
Person对象方法goHome传入的参数对象为匿名对象[Car new];
2>匿名类的第二种用法
匿名类可以调用方法
[[Car new] run];
3> 匿名类的第二种用法
访问类的成员变量 实际上达不到我想要的效果
//[Car new]每执行一次,都会分配一块新的存储空间
[Car new]->_color=2;
三:封装
类的封装:
只能通过类的对象方法来访问类的成员变量的措施
类的成员变量提供set和get方法
set设置类的成员变量,set方法
@interface Car:NSObject
{
//实例变量
int _lunzi;
int _color;
}
//定义set方法
-(void)setLunzi:(int)lunzi;
//定义get方法
-(int)lunzi;
//set color
-(void)setColor:(int)color;
-(int)color;
@end
@implementation Car
//定义set方法
-(void)setLunzi:(int)lunzi{
_lunzi = lunzi;
}
//定义get方法
-(int)lunzi{
return _lunzi;
}
//set color
-(void)setColor:(int)color{
_color = color;
}
-(int)color{
return _color;
}
@end
书写规范:
set方法:
1)对象方法
2)即然是设置成员变量值,set方法,可以没有返回值
3)以set+去掉下划线的成员变量名,并且成员变量的首字母要大写
4)既然要设定成员变量值,就得传过来要设定的值
传递过来的值得类型要和要设定的成员变量名一致
形参一般是去掉下划线的成员变量名
get获取当前类的成员变量值,get方法 (可以实现懒加载:需要时在加载)
get方法
1)对象方法
2)既然要获取成员变量的值,方法得有返回值
3)返回值得类型必须要和要返回的成员变量的类型要一致
4)方法名一般是去掉下划线的成员变量名
封装的好处:1,不允许外部修改对象属性的值,只能通过对象的方法修改
2,可以合理的对外部传入的值进行判断其合理性
四:成员变量作用域
@public 修饰成员变量在任何地方通过对象都可以访问
@protected 系统默认修饰符 在本类和子类中可以访问
@private 只有本类中才能访问
@package 在同一个框架中可以访问 (其介于共有和私有之间)
在.m文件中定义的变量或者方法都是私有的,外部文件或者子类都不能调用
#import "Person.h"
@implementation Person
int a;
//这个方法也是私有的
-(void)getPassword{
NSLog(@"获取到人得密码了");
}
-(void)test{
//self是一个对象
[self getPassword];
a = 100;
NSLog(@"_id = %d,a = %d",_id,a);
}
@end
Person *p = [Person new];
[p test]; p->a(属性值a和方法test就无法访问)