在OC中的构造函数和C++中有很大相似之处,但是也有不同,下面我们就来看看在OC中构造函数的,声明,定义和调用。
在这个地方我们通过一个例子来说明:
我们在OC中创建一个Person类:
Person.h:
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property NSString *pname;
@property int age;
@property NSString *address;
//声明构造函数,可以看到的是:构造函数有实例构造函数,和类构造函数,当然实例构造函数顾名思义就是通过创建实例类初始化对象,类构造函数是直接又类名调用。那么两者的定义有怎样的区别:,首先是知道的构造函数的返回值都是一个实例,(instancetype),实例构造函数最前面是一个 ‘-’然而类构造函数的最前面是''+",而且实例构造函数在最开始的字符都是initWith
而且With的W是必须大写的,这个是有参数的实例化对象的。
-(instancetype)initWithPname:(NSString *)pname age:(int)age andAddress:(NSString *)address;
+(instancetype)personWithPname:(NSString *)pname age:(int)age andAddress:(NSString *)address;
@end
//构造函数的定义:
#import "Person.h"
@implementation Person
-(instancetype)initWithPname:(NSString *)pname age:(int)age andAddress:(NSString *)address
{
if([super init])//对父类进行初始化
{
self.pname=pname;//调用set函数给对象进行赋值
self.age=age;
self.address=address;
}
return self;//最后的返回值是一个对象的本身。
}
+(instancetype)personWithPname:(NSString *)pname age:(int)age andAddress:(NSString *)address
{//这个是类的构造方法,在这个构造方法其实是首先为对象分配内存,然后调用方面的方法为成员变量进行赋值
return [[self alloc] initWithPname:pname age:age andAddress:address];
}
//最后是方法的调用:
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//Person *per = [Person new];这个地方实例化一个对象,并且调用的是默认的构造函数
//Person *per = [[Person alloc] init];//这个地方的实际上也是调用默认的构造函数,上面的new其实不仅仅有分配内存空间的作用,而且还能初始化对象,所谓的初始化对象是给成员变量进行赋值,但是我们并不知到赋的是什么值,可以这样理解,创建对象的时候,对象就像没有被修理的土地一样,杂草丛生,但是当我们实例化对象就不同了,我们像给对土地清理干净了。
//Person *per = [[Person alloc] initWithPname:@"帅的不要不要的" age:18 andAddress:@"苏州"];
//这个是我们利用自己定义的构造函数来实例化对象,而且要知道的是我们利用自己创建构造函数来实例化对象的时候,是需要为首先是分配内存空间然后调用构造函数
Person *per = [Person personWithPname:@"帅的不要不要的" age:18 andAddress:@"苏州"];
//而且还要知道的是这个地方是通过类名来调用构造函数。
NSLog(@"%@",per);
}
return 0;
}