免费开源的iOS开发学习平台

OC对象Object:1-创建对象

对象是类Class运行时的实例,它包含了自己的实例变量(属性中声明)的内存副本以及类方法的指针,在实际开发中可以采用分配内存地址alloc以及初始化init两个步骤来创建一个对象。

对象的创建分为两个阶段:内存空间分配和初始化。通常情况下,初始化总是紧跟在内存空间分配之后进行的,但是在创建对象的过程中,这两个操作的作用是不同的。

1、分配内存空间alloc

在为一个对象分配内存空间时,需要调用alloc或者allocWithZone:方法。

除了为对象在程序的内存区划定一块合适大小的内存空间之外,alloc方法还有如下的几个重要作用:

  • 将对象的引用计数retain count设置为1。其中,引用计数与对象的内存管理有关,在ARC模式下,当引用计数为0时,对象会被释放;

  • 使初始化对象的isa指针并指向对象的类。在实际开发过程中,会遇到对象类和类对象两个概念,其中,对象类是一个根据类定义编译得到的运行对象。另外,每一个对象都有一个isa指针标识其是哪个类的实例;

  • 将类中定义的属性(实例变量)的值初始化为0或者nil。

如下方的示例代码,创建了一个MYClass类的对象,只执行了alloc操作,在内存中分配了内存空间,但未进行任何初始化操作。我们打印了这个对象的地址是存在的,但是其name属性的值为空。

#import "MYClass.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        MYClass *obj = [MYClass alloc];
        NSLog(@"对象的内存地址:%p,对象name属性的值:%@",obj,obj.name);
    }
    return 0;
}

运行结果:

2、初始化init

初始化的过程将对象的实例变量设置为合理且有用的初始值,还可以分配和准备对象需要的其他全局资源,并在必要时加载诸如文件这样的资源。初始化方法一般都以init开头,可以设置多个初始化的方法,例如, NSString类,提供了如下初始化方法:

- (instancetype)init NS_DESIGNATED_INITIALIZER;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithCharacters:(const unichar *)characters length:(NSUInteger)length;
- (nullable instancetype)initWithUTF8String:(const char *)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:(const void *)bytes length:(NSUInteger)len encoding:(NSStringEncoding)encoding;

以init方法为例,在对象调用init方法时,主要完成了如下的工作:

  • 调用父类的初始化方法[super init];

  • 如果父类返回的对象不为空,则可以对对象进行进一步的设置;例如,在一个自定义UIView类中,可以设置该类的backgroundColor属性;

  • 如果父类返回的对象为nil,则直接返回nil。

- (instancetype)init
{
    self = [super init];
    if (self) {
        //添加自定义声明  
        ...    
    }
    return self;
}

3、类方法

类方法是方法前面为+号的方法,类方法把创建对象过程的两个步骤(内存空间分配+初始化)合并,直接返回被创建的对象。在实际开发过程中,类方法的使用非常普遍,例如,NSString类也提供了如下一些类方法:

+ (instancetype)string;
+ (instancetype)stringWithString:(NSString *)string;
+ (instancetype)stringWithCharacters:(const unichar *)characters length:(NSUInteger)length;
+ (nullable instancetype)stringWithUTF8String:(const char *)nullTerminatedCString;
+ (instancetype)stringWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
+ (instancetype)localizedStringWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);

下方的示例代码中分别使用类方法和实例方法创建了NSString类型的对象,并打印出字符串的内容。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //使用类方法创建字符串对象
        NSString *str = [NSString stringWithFormat:@"www.99ios.com"];       
        //使用alloc + init方法创建字符串对象
        NSString *str2 = [[NSString alloc] initWithString:@"九九学院"];       
        NSLog(@"%@, %@",str,str2);        
    }
    return 0;
}

运行结果:

示例代码

https://github.com/99ios/3.4.1