-------<a href="http://www.itheima.com"target="blank">android培训</a>、<a href="http://www.itheima.com"target="blank">java培训</a>、期待与您交流! ----------
一、点语法的基本使用
一个对象的点语法,其实就是set和get方法。只不过写成点语法之后,编译器会自动转换为set或者get方法,并不是代表访问p中的成员变量。这点要与java中的点语法区分开,java中是访问成员变量。
Person *p = [Person new]; //创建一个对象
p.age = 10; //利用点语法给成员变量赋值
//相当于[p setAge: 10];
p.weight = 12.3; //相当于[p setWeight];
int a = p.age; //获取成员变量,相当于get方法
//相当于a = [p age];
double b = p.weight;
NSLog(@"%d, %f", a, b);
(1)点方法使用注意
@implementation Person
- (void)setAge: (int)age
{
_age = age;
self.age = age; //这是一个死循环,在set方法中不能出现这样的指令
//[self setAge: age];
}
@end
有了点语法,set和get的方法还是不能省略的。因为点语法的实质就是调用set和get方法,如果没有了,那就无法调用。
二、成员变量作用域
@protected:受保护的,该实例变量只能在该类和其子类内访问,其他类内不能访问。默认为此状态。
@private:私有的,该实例变量只能在该类内访问,其他类内不能访问。
@public:共有的,该实例变量谁都可以访问。(1)在实现方法中定义的成员变量是私有的;
(2)没有类的声明,也可以直接在main函数中直接定义方法类,且可用@public改为公有(默认为私有);
(3)子类继承父类后,子类拥有父类的所有方法和属性。但是,关键是子类是否可以直接访问。一般情况下是不可以直接访问父类的属性的,而要通过方法来访问(默认)。
三、@property和@synthesize
这两条指令可以帮助我们自动生成set和get方法。
1、@property int age;自动生成某个成员变量的get和set方法声明。
等同于:- (void)setAge: (int) age; - (int) age;
2、@synthesize age = _age;//对age进行实现。
@implementation Person
@synthesize age = _age;
@end
3、如果类型相同可以一起写
@property int speed, wheels; //会自动访问_speed 和_wheels,如果不存在,会自动生成,且为@private类型。
4、利用@property完全可以实现set和get的声明以及方法实现。
@property int no;
//这句话的作用:(1)已经自动生成了成员变量_no;
// (2)已经声明了no得方法;
// (3)已经完成了实现。
5、已经存在某个成员变量,或者实现方法时,@property就不会再生成相应的变量或者方法了。
@interface Person : NSObject
@property int no; //实现中不会自动生成get方法
@end
@implementation Person
- (int)no //此处已经手动写入了get方法,因此不会再自动生成
{
return _no;
}
@end
四、类型关键字id
id声明的对象的特性:
(1)没有 * 号;
(2)动态数据类型;
(3)可以指向任何类的对象(设置是nil),而不关心其具体类型;
(4)在运行时检查其具体类型;
(5)可以对其发送任何(存在的)消息;
五、构造方法
构造方法就是对对象进行初始化的方法。
1、[Person new]; //new是一个类方法。
要想完整的创建一个可用对象:首先要分配内存空间,利用alloc;其次要初始化,利用init。
alloc:类方法,创建一个xx类型的已分配好内存的对象;
init:对象方法,对已创建的对象进行初始化;
2、init构造方法
构造方法都是在@implementation中实现。基本使用格式为:
//init构造方法
- (id)init
{
//1、首先一定要调用super的init方法:初始化父类中的成员变量和其它属性。
self = [super init]; //为了回到当前的对象
if (self != nil)
{ //初始化成功
_age = 10;
}
// if (self = [super init]) //可以这样写,以后就用这种方法
// { //初始化成功
// _age = 10;
// }
return self;
}
如果父类和子类都含有init方法,那么优先调用子类的,再从子类的init中进入父类的init。但构造方法是优先调用NSObject中的。
重写构造方法的目的:为了使对象在创造出来时,成员变量就会有一些固定的值。
重写自定义构造方法的规范:(1)一定是对象方法,以“-”开头;(2)返回值一般为id类型;(3)方法名一般以init开头。
带有变量传入的程序:
- (id)initWithAge:(int)age
{
//1、首先一定要调用super的init方法:初始化父类中的成员变量和其它属性。
self = [super init]; //为了回到当前的对象
if (self != nil)
{ //初始化成功
_age = age;
}
return self;
}
-------<a href="http://www.itheima.com"target="blank">android培训</a>、<a href="http://www.itheima.com"target="blank">java培训</a>、期待与您交流! ----------