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
复制代码

 

posted on   低头捡石頭  阅读(96)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示