OC语言 - 构造方法
■ 前言
OC 中 init 开头的方法我们称之为构造方法,也叫初始化方法。比如 Person *p = [Person new] 这里的 new 方法分两步实现
1. 先使用 alloc 方法来分配存储空间
2. 使用 init 方法来对对象进行初始化,目的就是让某个实例对象一创建出来就拥有某些属性和值
注:构造方法的返回值是 id/instancetype 型,一般建议使用 instancetype;一个类中可以有多个初始化方法,但默认初始化方法只有一个
代码示例:使用构造方法
1. 让每一个 Person 实例对象创建出来的初始值是 10,而不是默认的 0
// - Person.h
#import <Foundation/Foundation.h> @interface Person : NSObject @property int age; @end
// - Person.m
#import "Person.h" @implementation Person -(id)init{ // 首先要初始化父类成员变量 if (self = [super init]) { // 然后初始化对象自身的成员变量 _age = 10; } // 返回初始化对象 return self; } @end
// - main.m
#import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { Person *p = [Person new]; NSLog(@"%d",p.age); } return 0; }
2. 要求 Student 实例对象初始化之后,年龄是 10,学号是 1
// - Student.h
#import "Person.h" @interface Student : Person @property int Num; @end
// - Student.m
#import "Student.h" @implementation Student -(id)init{ // 调用父类的初始化方法,会把年龄初始化成 10 if (self = [super init]) { _Num = 1; } return self; } @end
// - main.m
#import <Foundation/Foundation.h> #import "Person.h" #import "Student.h" int main(int argc, const char * argv[]) { @autoreleasepool { Student *s = [Student new]; NSLog(@"%d,%d",s.age,s.Num); } return 0; }
■ 自定义构造方法
声明规范如下
1. 一定是对象方法,且以 - 号开头
2. 返回值一般是 id/instancetype 型
3. 方法名以 initWith 开头
代码示例:
// - Person.h
#import <Foundation/Foundation.h> @interface Person : NSObject @property NSString *name; @property int num; -(id)initWithName:(NSString*)name; -(id)initWithName:(NSString*)name andNum:(in)no; @end
// - Person.m
#import "Person.h" @implementation Person -(id)initWithName:(NSString*)name{ if (self = [super init]) { _name = name; } return self; } -(id)initWithName:(NSString*)name andNum:(int)no{ if (self = [super init]) { _name = name; _num = no; } return self; } @end
// - Student.h
#import "Person.h" @interface Student : Person @property int age; -(id)initWithName:(NSString*)name andNum:(int)no andAge:(int)age; @end
// - Student.m
#import "Student.h" @implementation Student -(id)initWithName:(NSString*)name andNum:(int)no andAge:(int)age{ if (self = [super init]) { _age = age; } return self; } @end
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律