[置顶] ios对象初始化以及初始化方法

时间:2022-08-20 19:46:04

我的gitHub,如果有喜欢的欢迎star哦https://github.com/liyuunxiangGit/CircleOfFriendsDisplay


1、所有的类调用alloc方法来分配内存

2、init方法完成初始化

init方法虽然 可以完成初始化,但是由于它是完成最基本的初始化,因此,对象的所有成员变量依然是0;


一、我们可以重写初始化方法:init

NSObject提供的初始化时最基本的初始化,因此,对象的所有成员变量都为0;

我们在实际的变成过程中,可以提供自己的init方法,这个方法实际上就是重写NSObiect的init方法,当我们重写init方法时,我们可以加入任意的自定义的处理代码对属性执行初始化。

如下:

程序代码:LYXUser.h

//
// LYXUser.h
// 对象初始化练习

#import <Foundation/Foundation.h>

@interface LYXUser : NSObject
@property(nonatomic,copy)NSString *name;
@property(nonatomic,assign)int age;
@property(nonatomic,copy)NSString *address;
@end


程序代码:LYXUser.m

//
// LYXUser.m
// 对象初始化练习

#import "LYXUser.h"

@implementation LYXUser
@synthesize name;
@synthesize age;
@synthesize address;

-(id)init
{
//调用父类的init方法进行初始化,将初始化得到的对象赋值给self对象
//如果self对象不为nil,表明父类init方法初始化成功
if (self = [super init]) {
self.name = @"猴年宋小宝";
self.age = 400;
self.address = @"中国大连";
}
return self;
}
@end

程序代码:main.m

//
// main.m
// 对象初始化练习
//

#import <Foundation/Foundation.h>
#import "LYXUser.h"

int main(int argc, const char * argv[]) {
@autoreleasepool {
LYXUser *user = [[LYXUser alloc]init];
NSLog(@"用户的名字是:%@",user.name);
NSLog(@"用户的年龄为:%d",user.age);
NSLog(@"用户的住址为:%@",user.address);
}
return 0;
}

上方代码 LYXUser *user = [[LYXUser alloc]init];会为LYXUser对象分配内存空间,并调用init方法执行初始化,只是这个init方法不是NSObject提供的,而是上方的LYXUser.m文件提供的,这样就可以使新生成的LYXUser对象已经被赋值


输出:

2016-02-14 09:13:28.415 对象初始化练习[2735:198404] 用户的名字是:猴年宋小宝
2016-02-14 09:13:28.416 对象初始化练习[2735:198404] 用户的年龄为:400
2016-02-14 09:13:28.416 对象初始化练习[2735:198404] 用户的住址为:中国大连
Program ended with exit code: 0


当我们重写初始化方法时,大致上总满足如下模板:
-(id)init
{
//调用父类的init方法进行初始化,将初始化得到的对象赋值给self对象
//如果self对象不为nil,表明父类init方法初始化成功
if (self = [super init]) {
//执行初始化
}
return self;
}


二、便利的初始化方法

由于系统的初始化方法总是固定的,所以我们可以根据业务需要,为其提供更多的便利的初始化方法,这些方法通常是init开头,并允许带一些参数。

程序代码:LYXUser.h

//
// LYXUser.h
// 对象初始化练习

#import <Foundation/Foundation.h>

@interface LYXUser : NSObject
@property(nonatomic,copy)NSString *name;
@property(nonatomic,assign)int age;
@property(nonatomic,copy)NSString *address;

-(id)initWithName:(NSString *)name age:(int)age;
-(id)initWithName:(NSString *)name age:(int)age address:(NSString *)address;

@end


程序代码:LYXUser.m

//
// LYXUser.m
// 对象初始化练习

#import "LYXUser.h"

@implementation LYXUser
@synthesize name = _name;
@synthesize age = _age;
@synthesize address = _address;

-(id)init
{
//调用父类的init方法进行初始化,将初始化得到的对象赋值给self对象
//如果self对象不为nil,表明父类init方法初始化成功
if (self = [super init]) {
//对该对象进行赋初始值
self.name = @"猴年宋小宝";
self.age = 400;
self.address = @"中国大连";
}
return self;
}
//实现下方方法,完成自定义初始化
-(id)initWithName:(NSString *)name age:(int)age
{
//调用父类的init方法进行初始化,将初始化得到的对象赋值给self对象
//如果self对象不为nil,表明父类init方法初始化成功
<strong>if (self = [super init]) {
//对该对象进行赋初始值
self.name = name;
self.age = 10;
self.address = @"中国呼和浩特";</strong>
}
return self;
}
//实现下方方法,完成自定义初始化
-(id)initWithName:(NSString *)name age:(int)age address:(NSString *)address
{
//调用本类的initWithName: age:方法进行初始化,将初始化得到的对象赋值给self对象
//如果self对象不为nil,表明initWithName: age:方法初始化成功
<strong>if (self = [self initWithName:name age:age]) {
//对该对象的address进行赋值
self.address = address;
}</strong>
return self;
}
@end

上方第一段程序的粗体字满足前面写的初始化方法,首先调用父类init方法执行默认初始化,然后判断初始化的对象不为nil时,程序会根据传入的参数对对象进行赋值。

粗体字就是/strong中间的字

第二段代码中的黑体字我们看上不不像前方我写的初始化方法的模板,这是因为当前类中已经有了初始化两个属性的方法,所以程序首先调用当前的另一个初始化方法执行初始化,然后判断初始化得到的对象是否为nil ,如果不为nil,程序会再次根据传入的address属性赋值,从代码可以看出,上面第三个初始化方法直接复用了第二个初始化方法,因此,可以提供更好的代码复用。

程序可以在创建对象是立即初始化对象的属性,避免对象创建完成后还要通过调用对象的setter方法来设置对象的属性值。

程序代码:main.m

//
// main.m
// 对象初始化练习
//

#import <Foundation/Foundation.h>
#import "LYXUser.h"

int main(int argc, const char * argv[]) {
@autoreleasepool {
LYXUser *user1 = [[LYXUser alloc]init];
NSLog(@"用户的名字是:%@",user1.name);
NSLog(@"用户的年龄为:%d",user1.age);
NSLog(@"用户的住址为:%@",user1.address);
LYXUser *user2 = [[LYXUser alloc]initWithName:@"*" age:@(49)];
NSLog(@"用户的名字是:%@",user2.name);
NSLog(@"用户的年龄为:%d",user2.age);
NSLog(@"用户的住址为:%@",user2.address);
LYXUser *user3 = [[LYXUser alloc]initWithName:@"*" age:99 address:@"陕西延安"];
NSLog(@"用户的名字是:%@",user3.name);
NSLog(@"用户的年龄为:%d",user3.age);
NSLog(@"用户的住址为:%@",user3.address);


}
return 0;
}

输出我们可以看到:

2016-02-14 09:38:24.366 对象初始化练习[2767:296433] 用户的名字是:猴年宋小宝
2016-02-14 09:38:24.366 对象初始化练习[2767:296433] 用户的年龄为:400
2016-02-14 09:38:24.366 对象初始化练习[2767:296433] 用户的住址为:中国大连
2016-02-14 09:38:24.366 对象初始化练习[2767:296433] 用户的名字是:*
2016-02-14 09:38:24.367 对象初始化练习[2767:296433] 用户的年龄为:10
2016-02-14 09:38:24.367 对象初始化练习[2767:296433] 用户的住址为:中国呼和浩特
2016-02-14 09:38:24.367 对象初始化练习[2767:296433] 用户的名字是:*
2016-02-14 09:38:24.367 对象初始化练习[2767:296433] 用户的年龄为:10
2016-02-14 09:38:24.367 对象初始化练习[2767:296433] 用户的住址为:陕西延安
Program ended with exit code: 0