对象是类Class运行时的实例,它包含了自己的实例变量(属性中声明)的内存副本以及类方法的指针,在实际开发中可以采用内存地址分配以及初始化两个步骤来创建一个对象。
对象的创建分为两个阶段:内存空间分配和初始化。初始化总是紧跟在内存空间分配之后进行的,但是在创建对象的过程中,这两个操作的作用是不同的。
1、分配内存空间alloc
在为一个对象分配内存空间时,需要调用alloc(或者allocWithZone:)方法。
除了为对象在程序的内存区划定一块合适大小的内存空间之外,alloc方法还有如下的几个重要作用:
将对象的retain count设置为1;
使初始化对象的isa实例变量指向对象的类,其中,对象类是一个根据类定义编译得到的运行对象。另外,每一个对象都有一个isa变量标示它是哪个类的实例;
将其他类中定义的实例变量的值初始化为0或者nil。
2、初始化init
初始化的过程将对象的实例变量设置为合理且有用的初始值,还可以分配和准备对象需要的其他全局资源,并在必要时装在诸如文件这样的资源。
初始化方法一般都以init开头,可以设置多个初始化的方法,例如, NSString类,提供了如下初始化方法:
-(instancetype)init NS_DESIGNATED_INITIALIZER;
-(nullable instancetype)initWithCoder:(NSCoder*)aDecoder NS_DESIGNATED_INITIALIZER;
-(instancetype)initWithCharacters:(constunichar*)characters length:(NSUInteger)length;
-(nullable instancetype)initWithUTF8String:(constchar*)nullTerminatedCString;
-(instancetype)initWithString:(NSString*)aString;
-(instancetype)initWithFormat:(NSString*)format,...NS_FORMAT_FUNCTION(1,2);
-(instancetype)initWithFormat:(NSString*)format locale:(nullable id)locale,...NS_FORMAT_FUNCTION(1,3);
-(instancetype)initWithFormat:(NSString*)format locale:(nullable id)locale arguments:(va_list)argList NS_FORMAT_FUNCTION(1,0);
-(nullable instancetype)initWithData:(NSData*)data encoding:(NSStringEncoding)encoding;
-(nullable instancetype)initWithBytes:(constvoid*)bytes length:(NSUInteger)len encoding:(NSStringEncoding)encoding;
以init方法为例,在对象调用init方法时,主要完成了如下的工作:
调用父类的初始化方法[super init];
如果父类返回的对象不为空,则可以对对象进行进一步的设置;例如,在一个自定义UIView类中,可以设置该类的backgroundColor属性;
如果父类返回的对象为nil,则直接返回nil。
-(instancetype)init
{
self=[superinit];
if(self){
//添加自定义声明
}
returnself;
}
3、类方法
类方法是方法前面为+号的方法,类方法把创建对象过程的两个步骤(内存空间分配+初始化)合并,直接返回被创建的对象。在实际开发过程中,类方法的使用非常普遍,例如,NSString类也提供了如下一些类方法:
+(instancetype)string;
+(instancetype)stringWithString:(NSString*)string;
+(instancetype)stringWithCharacters:(constunichar*)characters length:(NSUInteger)length;
+(nullable instancetype)stringWithUTF8String:(constchar*)nullTerminatedCString;
+(instancetype)stringWithFormat:(NSString*)format,...NS_FORMAT_FUNCTION(1,2);
+(instancetype)localizedStringWithFormat:(NSString*)format,...NS_FORMAT_FUNCTION(1,2);
示例代码:分别使用类方法和普通方法创建对象
intmain(intargc,constchar*argv[]){
@autoreleasepool{
//使用类方法创建字符串对象
NSString*str=[NSStringstringWithFormat:@"www.hcios.com"];
//使用alloc + init方法创建字符串对象
NSString*str2=[[NSStringalloc]initWithString:@"宏创学院"];
NSLog(@"%@, %@",str,str2);
}
return0;
}