1.在方法的内部,可以定义1个和属性相同的局部变量。
这个时候,如果在方法中访问这个同名的变量,访问的是局部变量
如果这个时候,我们非要访问这个同名的属性,
self:自己的可以用在对象方法,和方法当中使用,self的本质是个指针
在对象方法中self指向当前对象
类方法中self指向当前类
self:用在对象方法中,指向当前对象(谁调用这个方法,谁就是当前对象)
在对象方法中,self指向当前对象,作用是可以使用self显示的访问当前对象的属性。
self->属性,代表访问当前对象的属性;可使用self来调用当前对象的其他的对象方法
对象方法中使用self的场景:1.如果在方法中存在和属性同名的局部变量;如果想要访问同名的局部变量,直接写就可以;如果想要访问当前对象的同名属性,必 须使用self
2:在对象方法当中,如果要调用当前对象的其他的对象方法,必须使用self。
选用场景:在方法当中,不存在和属性同名的局部变量,如果这个时候,想要访问当前对象的属性,用不用,self效果都是一样的,都是访问当前对象的属性。
#import <Foundation/Foundation.h>
@interface Person :NSObject
{
@public
NSString *_name;
int _age;
}
-(void)sayHi;
-(void)hehe;
@end
.m中
#import "Person.h"
@implementation Person
-(void)sayHi
{
NSLog(@"self ===%p",self);
// 在对象方法中,self指向当前对象,作用是可以使用self显示的访问当前对象的属性。
// self->属性,代表访问当前对象的属性
NSLog(@"_name==%@",self->_name);
NSLog(@"_name==%@",_name);
// NSString *_name = @"jack";
// NSLog(@"_name===%@",_name);
NSLog(@"我的名字叫%@,我的年龄%d",_name,_age);
}
-(void)hehe
{
NSLog(@"---------");
// 调用当前对象的sayHi方法
[selfsayHi];
}
@end
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc,constchar * argv[]) {
@autoreleasepool {
Person *p1 = [Personnew];
p1->_name =@"小明";
p1->_age =10;
[p1 sayHi];
NSLog(@"p1===%p",p1);
}
return0;
}
把self 放在类方法中:
类加载:当类第一次被访问的时候,会将类的代码存储在代码区,代码区中用来存储的空间也有一个地址(前面的OC基础中有关于类加载的说明, 不懂的可以去前面看看)
在类方法中,self也是一个指针,执行当前这个类再代码中的地址,self相当于这个类
地址是一样的
把self放到类方法中,来显示调用本类的其他的类方法
+(void)ddd
{
// [Person sb];
[self sb];
}
注意事项:
PS:
在对象方法中,self代表当前对象,所以可以通过self访问当前对象的成员
在对象方法中 不能使用self调用本类的对象方法
在类方法中self代表当前这个类,所以可以通过self调用当前类的其他的类方法
在类方法中不能使用self访问对象的成员,不能去直接访问属性和调用对象方法(如果非要调用,那就先建立对象再调用)