Objective-C—self 、super、点语法、成员变量的作用域、@property和@synthesize、id


---关键字:self 

 self的用途:
 1>概念:指向了当前对象(方法调用者),谁调用了当前方法,self就代表谁
 *self出现在对象方法中,self就代表对象
 *self出现在类方法中,self就代表类
 
 2>可以利用”self->成员变量名“访问当前对象内部的成员变量
 3>[self 方法名]可以调用其他对象方法\类方法

#import<Foundation/Foundation.h>

@interface Person : NSObject
{
    int _age;
}

- (void)setAge:(int)age;
- (int)age;
- (void)test;

@end

@implementation Person

- (void)setAge:(int)age
{
    //_age = age;
    self->_age = age;
}
- (int)age
{
    return self->_age;
}

- (void)test
{
    //self:指向了方向调用者,代表着当前对象
    int _age = 20;
    NSlog(@"Person的年龄是%d",self->_age);
}


@end


int main()
{
    Person *p = [Person new];
    [p setAge:10]
    return 0;
}

self方法能够造成死循环,在使用的时候一定要分清类方法和对象方法的名称

---关键字super

/*super的作用
1.直接调用父类中的某个方法
2.super处在对象方法中,那么就会调用父类的对象方法
super处在类方法中,那么就会调用父类的类方法
3.使用场合:子类重写父类的方法时想保留父类的一些行为
 */
#import<Foundation/Foundation.h>
@interface Zoombie : NSObject
- (void)walk;
@end

@implementation
- (void)walk
{
    NSLog(@"僵尸走了两步");
}
@end
/*****子类*****/
@interface JumpZoombie : Zoombie
- (void)walk;
@end

@implementation
- (void)walk
{
    NSLog(@"跳两下");
    //走两下(直接调用父类的walk方法)
    [super walk];
}
@end

---多文件开发 .h和 .m文件的分工

1.定义一个类分2个文件: .h声明文件、.m实现文件
.h :成员变量、方法的声明
.m :方法的实现

2.如果想使用某一个类,只需要#import类的 .h文件即可

---点语法

Person *p = [Person new];
 //点语法的本质还是方法调用
p.age = 10; // [p setAge:10];
int a = p.age; // [p age];
return 0;

---成员变量的作用域

1.作用域类型
1>@public :在任何地方都能直接访问对象的成员变量
2>@private :只能在当前类的对象方法中直接访问(@implementation中默认是@private)
3>@protected :可以在当前类及其子类的对象方法中直接访问
            (在@interface中默认为 @protected)
4>@package :只要处在同一个框架中,就能直接访问对象的成员变量

2.
1>在implementation中也可以声明成员变量,但是 implementation一般放在别的.h文件中,以至于系统根本看不到其中成员变量的存在,以及他的作用域,导致没有什么用,所以不提倡这样做。
2>@interface和@implementation中不能声明同名的成员变量

---@property和@synthesize

1.@property:可以自动生成某个成员变量的setter和getter声明

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    int _age;   
}

// @property:可以自动生成某个成员变量的setter和getter声明
@property int age;(代替了以下两行代码)
//- (void)setAge:(int)age;
//- (int)age;
@end

2.@synthesize:自动生成age的setter和getter实现,并且会访问_age这个成员变量

@implementation Person

// @synthesize自动生成age的setter和getter实现,并且会访问_age这个成员变量
@synthesize age = _age; // (代替了下面的一大坨实现setter和getter声明)
//- (void)setAge:(int)age
//{
//    _age = age;
//}
//- (int)age
//{
//   return _age;
//}

@end

3.在定义类的时候可以不声明成员变量,@synthesize 会自动生成
例如:
@implementation Car
//@synthesize speed = _speed, wheels = _wheels;
// 会访问_speed这个成员变量,如果不存在,就会自动生成@private类型的_speed变量
@synthesize speed = _speed;

再例如:
@implementation Cat
// 默认会访问age这个成员变量,如果没有age,就会自动生成@private类型的age变量
@synthesize age;

4.在程序中最精简的可以适用一句@property int age 来代替成员变量 _age(编译器会默认生成 _age这个成员变量)的声明和它的setter和getter方法的声明和实现

5.@synthesize的一些细节
1>@synthesize age = _age;
setter和getter实现中会访问成员变量 _age,如果成员变量 _age不存在,就会自动生成一个@private的成员变量 _age.
2>@synthesize age;
setter和getter实现中会访问成员变量 age,如果成员变量 age不存在,就会自动生成一@private的成员变量 age.
3>手动实现
*若手动实现了setter方法,编译器就只会自动生成getter方法
*若手动实现了getter方法,编译器就只会自动生成setter方法
*若同时手动实现了setter方法和getter方法,编译器就不会自动生成不存在的成员变量

---关键字id

id
1.万能指针,能指向任何OC对象,相当于NSObject *
2.id后面不要加上 *
3. id p = [Person new];  ==    Person p = [Person new];
注意:如果用id调用一个不存在的方法,编译器会马上报错 

你可能感兴趣的:(Objective-C—self 、super、点语法、成员变量的作用域、@property和@synthesize、id)