您的位置:首页 > 其它

OC学习,self使用总结和注意事项,理解类和对象,使用self进行理解非常好

2015-07-23 17:39 525 查看
self 谁调用当前方法,self就代表谁

1.self在对象方法中,self代表当前对象

2.self 在类方法中,self代表类

self使用注意

同事有对象方法和类方法存在的时候,self不会调错 +号类方法,-号是对象方法

下面放一些学习时候写得代码

1.self用在对象中得情况

.h文件
#import <Foundation/Foundation.h>

@interface Person : NSObject
-(void) run;
-(void) eat:(NSString*) foodName;
@end
.m文件

#import "Person.h"

@implementation Person
-(void) run
{
NSLog(@"人在走");
}
-(void) eat:(NSString*) foodName{//对象方法是-号开头也就是self是在main函数里new出来的对象
NSLog(@"人在吃%@",foodName);
NSLog(@"%p",self);//self在对象方法中使用,指代的是调用当前方法的那个对象,self是指代的p,p的eat,p的run
//    Person *p1 = [Person new];
//    [p1 run];
[self run];
}
@end


main函数

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
// NSLog(@"Hello, World!");

Person *p = [Person new];
NSLog(@"%p",p);
[p run];
[p eat:@"油条+鸡蛋"];

}
return 0;
}


2.self用在类的方法

.h文件

#import <Foundation/Foundation.h>

@interface Person : NSObject
+(void) test;
+(void) run;
-(void) eat;
@end


.m文件

#import "Person.h"

@implementation Person
+(void) test
{
NSLog(@"+test!");
}
+(void) run//类方法是+号,self是类本身
{
NSLog(@"\n+人在走!");
//self指代的是当前的类
//self ==Person
NSLog(@"\nself = %p",self);
//使用类调用类方法
[self test];
//此时self不能调用eat ,eat是对象方法,而self是类
//[self eat];
}
-(void) eat
{
NSLog(@"eat!");
}
@end


main函数

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {
@autoreleasepool {

Person  *p = [Person new];
NSLog(@"\np=%@",p);
//[p class] 返回的实质是当前类(类对象)
NSLog(@"\nPerson =%p",[p class]);
//通过Person调用类方法
[Person run];
}
return 0;
}


3.self在修饰变量中得作用

.h函数

#import <Foundation/Foundation.h>

@interface Dog : NSObject
{
int _speed;
}
-(void)setSpeed:(int)speed;
-(int)speed;
@end


.m函数

#import "Dog.h"

@implementation Dog
-(void)setSpeed:(int)speed

{
//函数内部可以定义和全局变量同名的变量
//如果同名,局部变量回暂时屏蔽全局变量的作用域
//局 局
_speed = speed;
//self表示访问的是类的实例变量,不加self访问的是局部变量,这就是如上要搞成 speed=speed 不能赋值的原因,self用在实参名和形参名相同的情况下
//  self->_speed =speed;
}
-(int)speed
{
return _speed;
}
@end
main函数和set规范

//  set方法 书写规范:
/*
1)必须以set开头,set后跟的去掉下划线的实例变量并且首字母大写
2)一定有参数
3)不能有返回值
4)一定是对象方法
5)形参名一般是去掉下划线的实例变量
6)形参类型和实例变量的类型一致
7)形参名一般不能和成员变量名相同,如果形同,则通过self访问成员变量
8)在set方法中一定得给实例变量赋值
*/
//  Created by 李荣闪 on 15/7/23.
//  Copyright (c) 2015年 SmartWork. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Dog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Dog *d1 = [Dog new];
[d1 setSpeed:80];
NSLog(@"speed=%d",[d1 speed]);

}
return 0;
}


此中用法,如果星灿明和成员变量名字相同,可以使用
self->_speed =speed;
也就是意味着self是对象的speed,这里代码没有改成一样的speed还是使用的是_speed,其实没必要使用self方法,命名时候注意规范就好了,类里面属性加下划线就好了,还有我看swift可以直接自动生成set和get方法。学习oc嘛,写吧!

这个方式带来的帮助就是调bug用,或者利用前人的代码的时候需要留心下!

至此self在类和对象与赋值,面向对象的里面有一定的理解了,self能够帮助理解面向对象的类和对象,也就是我所理解的模板和具体实例,面向对象嘛,以后就直接统一到大家的语法,就是类和对象,实例一个类就会有一个对象new出来嘛!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: