oc学习笔记——对象的初始化

为对象分配空间

当我们创建一个对象时,总需要通过调用该类的alloc类方法,alloc方法来自NSObject,oc所有的类都是其的子类,因此所有的类都可调用alloc方法来分配内容。
当使用alloc方法时,系统会进行如下操作

  1. 系统给所有的实例变量分配内存空间
  2. 将指针类型变量重置为nil,将bool类型变量变为NO,其余类型变量设置为0.
    仅仅分配内存空间的对象还不能使用,必须先对对象初始化,oc最常用的初始化方法为init,该方法来自NSObject,所有类可以通过此方法初始化,语法如下
[[类名 alloc] init];

如果创建对象不进行初始化,也可以运行,但可能会出现未知的错误,不建议不进行初始化。

初始化方法与对象初始化

上面提到的init方法只能使成员变量仍为0,实际编程中我们可能希望他的成员变量在初始化完获得特定的值,oc允许我们重新书写初始化方法,可以自定义处理代码对属性完成初始化。
下面通过一段代码来实现使用自定义方法来初始化:

首先是接口部分,定义了该类的三个属性。

#import <Foundation/Foundation.h>

@interface FKUser1 : NSObject
// 使用@property定义3个属性
@property (nonatomic , copy) NSString* name;
@property (nonatomic , assign) int age;
@property (nonatomic , copy) NSString* address;
@end

接下来是实现部分,重写该类的init方法:

#import "FKUser1.h"

@implementation FKUser1
@synthesize name;
@synthesize age;
@synthesize address;
// 重写该类的init方法
- (id) init {
    if (self = [super init]) {
        // 对该对象的三个属性赋值
        self.name = @"孙悟空";
        self.age = 5000;
        self.address = @"花果山";
    }
    return  self;
}
@end

接下来就可以输出了

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        FKUser1* p = [[FKUser1 alloc] init];
        NSLog(@"%@ %d %@", p.name, p.age, p.address);
    }

}

由于对该类的init方法进行了初始化,现在我们创建的对象在初始化时,已经被赋值。

动态初始化方法

在上面重写了init方法,但是这个方法对对象的初始化时总是固定的,oc可以自己定义更多便利的初始化,定义时一般以init开头,允许自带一些参数。
例如我们可以将下面的代码加入上面的代码
接口部分:

#import <Foundation/Foundation.h>
@interface FKUser : NSObject
// 使用@property定义三个属性
@property (nonatomic , copy) NSString* brand;
@property (nonatomic , assign) NSString* model;
@property (nonatomic , copy) NSString* color;
- (id) initWithBrand:(NSString *)brand model:(NSString *) model color: (NSString*) color;
@end

实现部分:

//
//  FKUser.m
//  oc日常
//
//  Created by 差不多先生 on 2021/5/30.
//

#import "FKUser.h"

@implementation FKUser
@synthesize brand = _brand;
@synthesize model = _model;
@synthesize color = _color;
- (id) init {
    if (self = [super init]) {
        self.brand = @"aodi";
        self.model = @"rs7";
        self.color = @"红色";
    }
    return  self;
}
- (id) initWithBrand: (NSString *) brand model: (NSString *) model color: (NSString *) color {
    if (self = [super init]) {
        self.brand = brand;
        self.model = model;
        self.color = color;
    }
    return self;
    
}
@end

这样就可以对对象完成动态的初始化操作,可以避免在创建对象后调用对象的点语法来设置对象的属性值。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值