new方法实现原理
Person *p = [Person new];//创建一个Person对象p
-
new
做了三件事情- 1.开辟存储空间 + alloc 方法
- 2.初始化所有的属性(成员变量) - init 方法
- 3.返回对象的地址
Person *p1 = [Person alloc];
-
alloc
- 1.开辟存储空间
- 2.将所有的属性设置为0 (对象类型值为null)
- 3.返回当前实例对象的地址
Person *p2 = [p1 init];
-
init
- 1.初始化成员变量, 但是默认情况下init的实现是什么都没有做
- 2.返回初始化后的实例对象地址
- 注意: alloc返回的地址, 和init返回的地址是同一个地址
// 创建一个对象都使用 alloc init, 这样可以统一编码格式
Person *p3 = [[Person alloc] init];
构造方法基本概念
-
概念: 在OC中
init
开头的方法, 称之为构造方法 - 构造方法的用途: 用于初始化一个对象, 让某个对象一创建出来就拥有某些属性和值
-
重写
init
方法: 在init方法中初始化成员变量 -
格式注意:
- 1.必须先初始化父类, 再初始化子类
- 2.必须判断父类是否初始化成功, 只有父类初始化成功才能继续初始化子类
- 3.返回当前对象的地址
Person.h代码示例如下
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property int age;
@end
Person.m代码示例如下
#import "Person.h"
@implementation Person
- (instancetype)init
{
// 注意: 不要把 = 号写为 ==
// 一定要将[super init]的返回值赋值给self
if (self = [super init]) {
// 初始化子类
_age = 6;
}
return self;
}
@end
自定义构造方法
-
其实就是自定义一个init方法
- 1.一定是对象方法
- 2.一定返回
id/instancetype - 3.方法名称一定以init开头
一个类可以有0个或者多个自定义构造方法
自定义构造方法可以有1个或多个参数
Person.h代码示例如下
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property int age;
@property NSString *name;
- (instancetype)initWithAge:(int)age andName:(NSString *)name;
@end
Person.m代码示例如下
#import "Person.h"
@implementation Person
- (instancetype)initWithAge:(int)age andName:(NSString *)name
{
if (self = [super init]) {
_age = age;
_name = name;
}
return self;
}
@end
-
自定义构造方法在继承中的表现
Student类继承自Person类
Student.h代码示例如下
#import "Person.h"
@interface Student : Person
@property int no; // 学号
- (instancetype)initWithAge:(int)age andName:(NSString *)name andNo:(int)no;
@end
Student.m代码示例如下
#import "Student.h"
@implementation Student
- (instancetype)initWithAge:(int)age andName:(NSString *)name andNo:(int)no
{
if (self = [super initWithAge:age andName:name]) {
_no = no;
}
return self;
}
@end
类工厂方法
- 类工厂方法: 用于快速创建对象的类方法, 称之为类工厂方法
- 作用: 类工厂方法中主要用于 给对象分配存储空间和初始化这块存储空间
-
规范:
- 1.一定是类方法 +
- 2.方法名称以类的名称开头, 首字母小写
- 3.一定有返回值, 返回值是
id/instancetype
- 注意: 自定义类工厂方法是苹果的一个规范, 一般情况下, 要给一个类提供自定义构造方法和自定义类工厂方法用于创建一个对象
Person.h代码示例如下
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property int age;
+ (instancetype)person;
+ (instancetype)personWithAge:(int)age;
@end
Person.m代码示例如下
#import "Person.h"
@implementation Person
+ (instancetype)person
{
return [[self alloc] init];
// 自定义类工厂方法, 在类工厂方法中创建对象一定要使用self来创建
// self在类方法中就代表类对象
// 谁调用当前方法, self就代表谁
}
+ (instancetype)personWithAge:(int)age
{
Person *p = [[self alloc] init];
p.age = age;
return p;
}
@end
- 补充注意: 自定义类工厂方法, 在类工厂方法中创建对象一定要使用self来创建, self在类方法中就代表类对象, 谁调用当前方法, self就代表谁
- 类工厂方法在继承中的注意点: 子类拥有父类的方法,可再定义自己的成员变量。