---关键字:self
self的用途: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调用一个不存在的方法,编译器会马上报错