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

来源:互联网 发布:中国何时能拆掉网络墙 编辑:程序博客网 时间:2024/05/16 02:06

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出来嘛!

0 0
原创粉丝点击