---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a
href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
id类型
数据类型:
1.可以用来定义变量
2.可以用来当作参数
3.可以用来当作返回值
id类型是一个万能指针(可以保持任何对象的地址)
id相当于 NSObject *
id的本质 typedef struct objc_object *id;
id是一个动态类型,在运行时才确定id的真实类型
id类型还可以调用私有方法
id和NSObject *的区别:id调用子类特有的方法不用强制类型转换
构造方法
什么是构造方法:
构造方法主要是用来初始化成员变量
如果想让对象一创建出来就具备一些值,我们可以重写构造方法(init)
1.开辟存储空间 +alloc
2.初始化成员变量 -init
3.返回地址
Person *p = [Person new];就等同于
Person *p = [[Person alloc] init];
如果想让一个成员变量初始化就赋值:
可以写成例如下面的格式
- (id)init{
if (self = [super init]) {
_age = age;//成员变量赋值
return self;
}
枪类
#import <Foundation/Foundation.h>
@interface Gun : NSObject
@property int bulletCount;//子弹数量
/*
射击方法
*/
- (void)shoot;
@end
#import "Gun.h"
@implementation Gun
- (id)init
{
if (self = [superinit]) {
_bulletCount = 10;
}
return self;
}
- (void)shoot
{
if (_bulletCount >0) {
NSLog(@"开了一枪");
_bulletCount--;
}else
{
NSLog(@"请上子弹");
}
NSLog(@"剩余子弹 %d", _bulletCount);
}
@end
警察类
@interface Police :NSObject
@property Gun *gun;
// 打手枪
- (void)fire;
@end
#import "Police.h"
@implementation Police
- (id)init
{
// 1.一定要调用父类的init方法
self = [superinit];
// 2.一定要判断self是否为空
if (self) {
_gun = [[Gunalloc]init];
}
// 3.一定要返回self
return self;
}
- (void)fire
{
// OC中没有空指针异常,也就是给Nil发送消息不会报错
[_gun shoot];
}
@end
#import "Police.h"
#import "Gun.h"
int main(int argc,constchar * argv[])
{
Police *p = [[Policealloc]init];
[p fire];
return 0;
}