id
一、什么是id
id == NSObject *
万能指针,能指向\操作任何OC对象
id类型的定义
typedef struct objc_object
{
Classisa;
} *id;
注意:id后面不要加“*” ,因为id本身就是指针类型
id p = [类名 new];
id d = [Person new];
[d setAge:10];
[dsetObj:@"321423432"];
构造方法
一、什么是构造方法
用来初始化对象的方法,是对象方法,- (id)init
例如:
Person *p = [[Personalloc] init];
完整地创建一个可用的对象:
1.分配存储空间 +alloc
调用+alloc分配存储空间
Person *p1 = [Personalloc];
2.初始化 –init
Person *p2 = [p1init];
构造方法的执行图:
二、重写init
@implementation Person
// 重写-init方法
- (id)init
{
// 1.一定要调用回super的init方法:初始化父类中声明的一些成员变量和其他属性
self = [super init]; // 当前对象 self
// 2.如果对象初始化成功,才有必要进行接下来的初始化
if (self != nil)
{ // 初始化成功
_age = 10;
}
// 3.返回一个已经初始化完毕的对象
return self;
}
@end
优化之后:
@implementation Person
- (id)init
{
if ( self = [super init] )
{ // 初始化成功
_age = 10;
}
// 3.返回一个已经初始化完毕的对象
return self;
}
@end
重写构造方法的目的:为了让对象创建出来,成员变量就会有一些固定的值
重写构造方法的注意点
1.先调用父类的构造方法([super init])
2.再进行子类内部成员变量的初始化
三、自定义构造方法
自定义构造方法的规范
1.一定是对象方法,一定以 - 开头
2.返回值一般是id类型
3.方法名一般以initWith开头
看下面两段代码例子:Person和Student分别是父类和子类
@implementation Person
- (id)init
{
if ( self = [super init] )
{
_name = @"Jack";
}
return self;
}
- (id)initWithName:(NSString*)name
{
if ( self = [super init] )
{
_name = name;
}
return self;
}
-(id)initWithAge:(int)age
{
if ( self = [super init] )
{
_age = age;
}
return self;
}
-(id)initWithName:(NSString *)name andAge:(int)age
{
if ( self = [super init] )
{
_name = name;
_age = age;
}
return self;
}
@end
@implementation Student
-(id)initWithNo:(int)no
{
if ( self = [super init] )
{
_no = no;
}
return self;
}
// 父类的属性交给父类方法去处理,子类方法处理子类自己的属性
-(id)initWithName:(NSString *)name andAge:(int)age andNo:(int)no
{
// 将name、age传递到父类方法中进行初始化
if ( self = [super initWithName:nameandAge:age])
{
_no = no;
}
return self;
}
@end
小细节:如若父类用@property声明且不事先声明成员变量则生成的成员变量是@private,子类不能访问,所以使用self加点语法访问。