系列文章目录
第一章 OC之单例模式
第二章 OC之初始化
第三章 OC之类和协议
第四章 OC之main函数的一些操作和基础概念
前言
浅谈初始化方法及初始化方法的重写
一、对象初始化?
- 什么是对象初始化?
我们在创建一个对象后,为其属性赋值就叫对象初始化
- 为对象分配空间:
[[类名 alloc]init]
[类名 new]
这两种方法本质完全相同。
- 将每个实例变量的内存空间都重置为0;
整形变量重置为0,浮点型对象重置为0.0。BOOL类型重置为NO。
- 初始化的作用
仅仅分配了内存的对象还不能使用,必须进行初始化,OC最常用的初始化方法是init。
init方法虽然可以完成初始化,但是它只是完成最基本的初始化,因此,对象的所有成员变量依然为0
我们来看看如果不初始化会出现怎样的结果:
类的接口:
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface User : NSObject
@property(nonatomic,copy) NSString*name;
@property(nonatomic,assign) int age;
@end
NS_ASSUME_NONNULL_END
类的实现:
在这里插入代码片#import "User.h"
@implementation User
@synthesize name;
@synthesize age;
@end;
测试:
#import"User.h"
#import<Foundation/Foundation.h>
int main() {
@autoreleasepool {
User* user = [[User alloc]init];
NSLog(@"user.name = %@,user.age = %d", user.name, user.age);
}
}
结果:
这里就看出来初始化的重要性了。
二、初始化方法
类的接口和实现部分都和上边相同,给出测试部分:
#import"User.h"
#import<Foundation/Foundation.h>
int main(){
@autoreleasepool {
User* user = [[User alloc]init];
user.name = @"娜娜";
user.age = 18;
NSLog(@"user.name = %@,user.age = %d", user.name, user.age);
}
}
结果:
三、重写初始化方法
类的接口:
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface User : NSObject
@property(nonatomic,copy) NSString*name;
@property(nonatomic,assign) int age;
@end
NS_ASSUME_NONNULL_END
类的实现:
#import "User.h"
@implementation User
@synthesize name;
@synthesize age;
-(id)init{
if(self = [super init]){
self.name = @"wang";
self.age = 18;
}
return self;
}
@end
测试部分:
#import"User.h"
#import<Foundation/Foundation.h>
int main(){
@autoreleasepool {
User* user = [[User alloc]init];
NSLog(@"user.name = %@,user.age = %d", user.name, user.age);
User* m = [[User alloc]init];
NSLog(@"m.name = %@,m.age = %d", user.name, user.age);
}
}
结果:
我们发现,这两个对象在调用init方法时,会自动为对象赋值。因为我们重写了init方法,我们这里使用的init方法不在是NSObject提供的,而是我们重写的。在我们调用被重写的init方法后,会自动给对象赋值。