1、点语法
1> 本质:是方法调用,不是成员调用
2> 当使用点语法时,编译器会自动展开成相应方法
stu.age=10 相当于 [stu setAge:10] (赋值为set方法)
int age=stu.age 相当于int age=[stu age] (取出为get方法)
死循环注意:
录入: -(void) setAge:(int) age {
// 下面的代码会引发死循环(因为循环调用了 [self setAge:age])
self.age=age;
}
读取: -(int) age{
// 下面的代码会引发死循环(因为循环调用了 [self age])
return self.age;
}
@public:任何地方都能直接访问对象的成员变量
@private:只能在当前类的对象方法中直接访问
@protected:能在当前类和子类的对象方法中直接访问
2、@property和@synthesize
1> @property用在@interface中,可以自动生成某个成员变量的setter 和getter的声明和实现
@property int age;
// 相当于 -(void) setAge :(int)age;
// -(int)age;
2> @synthesize用在@implementation中,可以自动生成某个成员变量的setter和getter的实现
@synthesize age=_age
// 相当于
-(void) setAge:(int)age;
{
_age = age;
}
-(int)age
{
return _age;
}
注意:
1、 如果只写了@synthesize age,默认访问age这个成员变量,如果没有age这个成员变量,会生成age这
个成员变量
2、 @synthesize age=_age 访问的是_age这个成员变量
3、 如果一个类没有定义成员变量,@synthesize age=_age会自动生成@private类型的_age变量
3、id:万能指针,能操作任何OC对象(只适用于OC对象)
构造方法:(用来完整的创建一个可用对象)
1. Person *p=[Person new];
(1)分配存储空间 (+alloc方法)
(2)初始化 (- init方法)
new方法做的事情
调用+alloc方法,分配存储空间 // Person *p1=[Person alloc];
调用- init 方法,进行初始化(初始化完毕,默认为0) // Person *p2=[p1 init];
- init 进行初始化,相当于:
Person *p3=[ [ Person alloc ] init ];
2. 任何对象构造之前首先要调用父类的构造方法(init)
3. 若想某个对象一创建出来,它的成员变量就是某个值(10),就重写构造方法
例: - (id) init
{
if(self = [ super init ]) //先调回super的init方法,如果对象初始化成功
{
_age=10 //赋值
}
return self; //返回初始化完毕的对象
}
4. 重写构造方法的步骤:(1)调用父类的构造方法,初始化父类([super init])
(2)再进行子类内部成员变量的初始化
5. 自定义构造方法
规范:(1)一定是对象方法,以 - 开头
(2)返回值一般都是id类型
(3)方法名一般以initwith开头
-(id)initwithName:(NSString*)name
{
if(self=[super init]) //先调回super的init方法,如果对象初始化成功
{
_name=name //赋值
}
return self; //返回初始化完毕的对象
}
4、分类(Category)(给类扩充一些方法)
1. 格式
分类的声明:@interface 类名(分类名称) @end
分类的实现:@implementation 类名(分类名称) @end
2. 作用:不改变原来类的内容的基础上为类增加一些新的方法
3. 注意点:
1>分类只能增加方法,不能增加成员变量
2>分类的实现里面可以增加成员变量
3>分类可是重新实现原来类中的方法,但是会覆盖,导致原来的方法不可再用
4>分类方法优先去分类中找,然后再去原来的类中找,最后再去父类中找
5、description方法(对象方法)
1> 默认情况下,利用NSLog和%@输出对象时,结果是<类名:对象地址>
2> 利用NSLog和%@输出对象时,会调用对象的-description方法,description方法的返回值是(NSString*)
3>若想将对象的属性值(age=10,name="jack")打印出来,可以重写description方法
-(NSString *)description
{
return [ NSString stringwithFormat : @"age is %d , name=%@" , _age , _name ];
}
*注意点:不能在-description方法中使用NSLog打印self (死循环)
4>利用NSLog和%@输出类对象时,结果为类名,因为调用的是+description方法
6、NSLog输出
NSLog(@"%p",&p) // 指针变量的地址
NSLog(@"%p",p) // 对象的地址
NSLog(@"%@",p) // 类名:对象地址
NSLog(@"%d",_ _LINE_ _) // 输出当前行号
NSLog(@"%s",_ _FILE_ _) // 输出文件路径
NSLog(@"%s\n",_ _func_ _) //输出所在函数名
NSLog输出语言字符串的时候,不能有中文
7、SEL
1>SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址,找到方法地
址,就可以调用方法
2>每个类的方法列表都存储在类对象中,每个方法都有一个与之对应的SEL类型的对象,根据一个SEL对象
就可以找到方法的地址进而调用方法
3>SEL对象的创建
SEL s=@selector(test); //将test方法包装成一个SEL类型的数据
SEL s2=NSSelectorFromstring(@"test"); //将字符串test包装成一个SEL类型的数据
4>SEL对象的其他用法
//将SEL对象转为NSString对象
NSString*str=NSStringFormSelector(@selector(test));
Person *p=[Person new];
//调用对象p的test方法
[p performSelector:@selector(test)];