您的位置:首页 > 移动开发 > Objective-C

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

2015-04-04 14:16 549 查看
---关键字: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调用一个不存在的方法,编译器会马上报错 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐