objective-c中的构造函数(对象初始化)(七)

iOS之深入解析Objective-C和Swift初始化 初始化 在 iOS 里面,无论是 Objective-C 还是 Swift,类(结构体、枚举)的初始化都有一定的规则要求,只不过在 Objective-C 中会比较宽松,如果不按照规则也不会报错,但会存在隐患,而在 Swift 则需要严格按照规则要求代码才能编译通过,极大提高了代码的安全性。 类(结构体、枚举)的初始化有两种初始化器(初始化方法):指定初始化器(Designated Initializers )、便利初始化器(Convenience Initializers)。 一、Designated I 阅读详情

 

holydancer原创,如需转载,请在显要位置注明:

转自holydancer的优快云专栏,原文地址:http://blog.youkuaiyun.com/holydancer/article/details/7354489

更多内容访问:这里

       以前我们创建对象时都是用new,从java过来的同学也都有这种习惯,其实objective-c中还有一种地道的创建对象的方法:[ [类名 alloc ] init].这种方法才是OC中创建对象的正统,不过效果和new是一样的,但是这种方法更能表示创建对象的实质,那就是分配内存,初始化对象。

 

alloc是在内存中划分一片空间,这片空间是一片处女地,然后呢,init初始化,我们可以在初始化的时候设置一些基本属性的值,这样就不用在创建对象后再调用方法来赋值。看代码:

human.h:

 

#import <Foundation/Foundation.h>

@interface Human : NSObject
{
    int age;
    NSString *name;
}
-(void)setAge:(int)a setName:(NSString *)n;
-(int)age;
-(NSString *)name;
@end


human.m:

 

 

#import "Human.h"

@implementation Human
-(id)init
{
    if(self=[super init])
    {
        age=20;
        name=@"holy";
    }
    return self;
}
-(void)setAge:(int)a setName:(NSString *)n
{
    age=a;
    [name release];
    
    name=[n copy];
}
-(int)age
{
    return age;
}
-(NSString *)name
{
    return name;
}
@end


main.m:

 

 

#import <Foundation/Foundation.h>
#import "Human.h"
int main(int argc, const char * argv[])
{
    NSAutoreleasePool *pool;
    pool =[[NSAutoreleasePool alloc] init];
    
    Human * human = [[Human alloc] init];
    NSLog(@"名字%@,年龄%d",[human name],[human age]);
    
    [human setAge:100 setName:@"GOD"];
    NSLog(@"名字%@,年龄%d",[human name],[human age]);

    [human release];
    [pool release];//相当于对池中每个对象执行了一次release;
    

}

 

 

上面的代码,在human类中有一个init方法,继承于NSObject类中,不用在human.h文件中声明,也可以不写,如果要设置默认的属性,就可以重写init方法,在里面进行对象的初始化,然后呢生成出来的对象就会有自己的默认属性值了。

其中有一行 if(self=[super init]) 这行代码主要是为了防止父类初始化失败,如果父类初始化失败了,会返回一个nil值,虽然可能性很小

这种初始化方法很好理解,但是有个缺点就是生成对象的默认属性值是固定的,如果想要修改的话需要再调用set方法,那么有没有可以在生成对象的时候自定义属性值的方法呢?既然这样说了,肯定是有的嘛,吼吼,请看代码:

Human.h:

 

#import <Foundation/Foundation.h>

@interface Human : NSObject
{
    int age;
    NSString *name;
}
-(id)initWithAge:(int)a Name:(NSString *)n;
-(int)age;
-(NSString *)name;
@end


Human.m:

 

 

#import "Human.h"

@implementation Human
-(id)init
{
    if(self=[super init])
    {
        age=20;
        name=@"holy";
    }
    return self;
}
-(id)initWithAge:(int)a Name:(NSString *)n
{
    if (self=[super init]) {
        age=a;
        [name release];
        
        name=[n copy];
    }
    return self;
   
}
-(int)age
{
    return age;
}
-(NSString *)name
{
    return name;
}
@end


main.m:

 

 

#import <Foundation/Foundation.h>
#import "Human.h"
int main(int argc, const char * argv[])
{
    NSAutoreleasePool *pool;
    pool =[[NSAutoreleasePool alloc] init];
    
    Human * human1 = [[Human alloc] init];
    NSLog(@"名字%@,年龄%d",[human1 name],[human1 age]);
    
    Human * human2 = [[Human alloc] initWithAge:100 Name:@"GOD"];
    NSLog(@"名字%@,年龄%d",[human2 name],[human2 age]);
    
    
    [human1 release];
    [human2 release];
    [pool release];//相当于对池中每个对象执行了一次release;
    

}


输出:

 

 

2012-03-14 21:03:24.974 String[460:403] 名字holy,年龄20
2012-03-14 21:03:24.976 String[460:403] 名字GOD,年龄100
关键字:objective-c ,objective c , oc ,构造函数 ,对象初始化 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
JAVA:Spring Boot3 集成 ShardingSphere 实现数据分库分表 本文介绍了基于Spring Boot和ShardingSphere-JDBC实现分库分表与读写分离的解决方案。针对高并发、大数据量场景下单库单表的性能瓶颈,通过配置ShardingSphere-JDBC实现:1)订单表按user_id和order_id分片到两个库和两张表;2)读写分离,写操作路由至主库,读操作在从库间负载均衡。方案使用Druid连接池优化,支持业务透明,无需修改SQL。 阅读详情

相关推荐

Cadence Allegro16.6怎么导出器件引脚信息的报告

当我们需要用到器件的引脚相关信息时,可以利用allegro中的reports这个功能导出器件的相关信息。下面是具体的操作步骤。

suyucheng66的博客 5747

Object-C 的构造函数析构函数

在oc当中,构造函数主要以init,initWithXXXX来命名,主要负责初始化的相关工作 可以理解为用alloc创建一块在堆上的内存空间,这块空间我们要在使用之前做一些基本的初始化工作,初始化数据,和父类建立关系 - (id)init { //调用父类方法,实例一个本类,涉及runtime,防止冲突,可以在构造方法里初始化一些数据等 self = [super init];

woshiwls的专栏 4005

基于WEKWS模型的语音唤醒关键词识别

本文所使用的模型网络结构继承自论文《Compact Feedforward Sequential Memory Networks for Small-footprint Keyword Spotting》,文中研究了将低秩矩阵分解与传统FSMN相结合的紧凑型前馈顺序记忆网络(cFSMN)用于远场关键字检测任务。

YuZhou的博客 6596

objective-c之构造函数

// // Student.h // constructor_method // // Created by wu jianhua on 16-7-29. // Copyright (c) 2016年 wujianhua. All rights reserved. // #import @interface Student : NSObject { @public i

云守护的专栏 705

糖果【贪心】

【问题描述】 有N(1≤N <100,000)N(1≤N~<100,000)N(1≤N <100,000)种不同类型的糖果,每种糖果数量无限多。第i种糖果每颗的价格是Pi(1≤Pi≤1018),有Ci(1≤Ci≤1018)P_i(1≤P_i≤10^{18}),有C_i (1≤C_i≤10^{18)}Pi​(1≤Pi​≤1018),有Ci​(1≤Ci​≤1018)头牛想吃这种糖果。 FarmerJohnFarmer JohnFarmerJohn拥有金钱BBB元(1≤B≤1

算法小猪的博客 795

Stable Diffusion跑图总爆显存?别急着换显卡,试试这个PYTORCH_CUDA_ALLOC_CONF参数调优

本文深入解析了Stable Diffusion运行中常见的显存不足问题,特别是由显存碎片化导致的假性OOM现象。通过详细讲解PYTORCH_CUDA_ALLOC_CONF参数中的max_split_size_mb设置技巧,提供了一套完整的显存优化方案,帮助用户在无需升级硬件的情况下显著提升AI绘画的稳定性与效率。

weixin_42524100的博客 347

直播硬件智能化:从云边端协同到物联网AI应用演进

在物联网与人工智能技术融合的背景下,设备智能化已成为行业核心趋势。其基本原理在于通过边缘计算与云端协同,将AI能力下沉至终端设备,实现数据本地化处理与实时响应。这一技术架构的价值在于显著降低延迟、节省带宽并提升隐私安全性,尤其适用于直播、安防、工业质检等对实时性要求高的场景。以直播硬件为例,传统独立的声光电设备已演变为高度集成的智能终端,通过内置NPU和AI算法实现美颜、虚拟背景、智能编码等功能。这种“云-边-端”协同的智能化范式,正是物联网设备从简单联网向感知决策演进的关键路径,也为构建更高效的AI智能化

weixin_30298497的博客 519

QMT vs Ptrade:量化交易新手如何根据需求选择券商系统(附实战案例)

本文对比了QMT和Ptrade两大券商量化交易系统的核心差异,帮助量化交易新手根据需求选择合适的平台。QMT适合技术面策略开发,执行效率高;Ptrade则提供全面的财务数据和复杂策略支持。通过实战案例,展示了如何结合两平台优势实现高效量化交易。

weixin_42683394的博客 527

objective-c 构造函数

objective-c 构造函数

leishui513的专栏 1002

当Flowable遇上AI:智能流程决策的未来探索

本文探讨了Flowable工作流引擎与AI技术的融合,构建智能流程决策系统的前沿实践。通过动态流程控制、机器学习优化表达式、自然语言生成规则等创新方法,显著提升业务流程的自动化水平和决策效率。重点解析了AI如何赋能Flowable核心引擎,实现从静态规则到动态智能的跨越式发展。

weixin_29271053的博客 392

IC版图设计布局经验90条!

13 如果一个cell调用其它cell,被调用的cell的vssx,vddx,vssb,vddb如果没有和外层cell连起来,要打上PIN,否则通不过diva检查.尽量在布局低层cell时就连起来。48 在匹配电路的mos管左右画上dummy,用poly,poly的尺寸与管子尺寸一样,dummy与相邻的第一个poly gate的间距等于poly gate之间的间距。8 更改cell时查看路径,一定要在正确的library下更改,以防copy过来的cell是在其他的library下,被改错。

weixin_44606964的博客 910

C++构造函数

1 构造函数的定义及特征 构造函数是类的一种特殊成员函数,其主要作用是对类的成员进行初始化,保证每个类成员都有一个合适的初始值。 构造函数有以下特征: 函数名与类名一致 没有返回值 对象实例化时自动调用对应的构造函数 支持函数重载 构造函数语法:类名(){} 需要注意的是, 没有返回值和返回值为空是两码事。返回值为空指的是该函数有返回值,其中返回值为void类型。而支持重载则说明,在一个类中,可以同时存在多个构造函数。 在代码段1中,People类提供了两个构造函数,其中第一个是无参构造函数,第二个是有

乌有先生ii的博客 8279

Agent驱动电商运营:从选品到售后的全链路革新

在当今竞争激烈的电商市场中,传统的电商运营模式面临着诸多挑战。从选品到售后,每个环节都需要大量的人力投入和专业知识。选品需要深入了解市场趋势和消费者需求,营销需要精准定位目标用户,客服需要24小时响应用户咨询。这些工作不仅耗时耗力,而且容易受到人为因素的影响,导致效率低下和成本高企。AI Agent是一种能够感知环境、做出决策并采取行动的智能系统。感知能力:能够获取和处理环境信息。决策能力:能够根据感知到的信息做出决策。行动能力:能够执行决策,对环境产生影响。学习能力。

AI 领航者的博客 354

谈谈Objective-C下对象的初始化

众所周知,Objective-C是一门面向对象的语言,一般情况下,我们在Objective-C中定义一个类时,总要提供一个初始化方法,一般大家都是这样写的: - (MyClass *)init { self = [super init]; if (self) { //执行一些资源、变量的初始化工作 } return s

行者常至 3616

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Objective-c下的对象初始化

在Objective-c中对象的初始化方式都有哪些呢?

576

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Objective-C中的方法重载与初始化方法

一、方法重载 OC中其实没有严格的方法重载。方法重载应该是参数个数不一样的“同名”方法,例如在下面的代码中:#import <Foundation/Foundation.h>@interface Parent : NSObject-(void) MethodWithArgsX:(double)x Y:(double)y;//1 -(void) MethodWithArgsX:(double)x Y

RinSingDeWanKing 2283

Objective-C introduction - 2

<!-- google_ad_client = "pub-8097737732457645";/* 728x90, 创建于 09-6-23 */google_ad_slot = "0915066646";google_ad_width = 728;google_ad_height = 90;// -->去我的目录上次说了Ob

huanglx的专栏 4639

Objective-C对象初始化小结

关于Objective-C对象初始化方法需要格外注意一些问题才能保证对象初始化的正确。这篇博文就需要注意的一些问题进行一个小小得总结,以便编写正确的代码。

448

objective-c学习 面向对象

接口部分(@interface):声明类的属性(成员变量)和方法(函数)实现部分(@implementation):实现这些方法的具体功能@interface Human : NSObject:声明一个名为Human的类,它继承自NSObject大括号 {} 中的是成员变量(用来描述对象的状态,比如数量、数据、名字)-表示实例方法(对象调用),+ 表示类方法(类直接调用)@end 表示类接口声明结束int _age;@end方法声明的语法格式如前文所说。

liusir0324的博客 1370

Objective--C 对象初始化

前言 目前为止我们已经学习了两种不同的方法创建对象。第一种是[类名 new];第二种是[[类名 alloc]init];这两种方法是等价的,但是Cocoa惯例是使用alloc和init而不使用new。那么这两者有什么区别呢? 1.首先new是调用了alloc 和init 2.第二种方法的init可以选择非系统默认的,可选择性更强 3.并且alloc分配内存的时候使用了zo...

genzld的博客 349

【IOS 开发学习总结-OC-15】objective-c面向对象之——对象初始化

创建对象有2种方法(本质是一样的,都是用 alloc 方法为对象分配内存空间)。 1.[[类名 alloc]init]; 2.[类名 new];为对象分配内存空间我们知道无论创建哪个对象,总需要先调用该类的 alloc 类方法来分配内存,这个alloc 类方法来自 NSObject, 而所有的 objective-c 类都是NSObject的子类。所以,所有的类都可以调用 alloc 方法来进行

Albert的专栏 2337

Objective-C边学边记-14:对象初始化

到目前为止,我们已经学习了两种创建新对象的方法:[类名 new] 和 [[类名 alloc] init]。这两种方法是等价的,不过Cocoa的惯例是使用后者。 有些语言(如C++和Java)使用构造函数在单次操作中执行对象的分配和初始化。Objective-C将这两种操作拆分为两个明确的步骤:分配和初始化。分配(allocation):向某个类发送alloc消息的结果就是为该类分配一...

weixin_30826761的博客 136

Objective-C对象的初始化(1)——分配与初始化

if (self = [super init])...

痴_Pro的博客 726

objective-c对象初始化

两种初始化方法:[Class new]    [[Class alloc]init]  两者等价,惯用后者  分配对象        分配(allocation)是一个新对象诞生的过程。是从操作系统获得一块内存并将其指定为存放对象的实例变量的位置。向某个类发送 alloc 消息的结果,就是为该类分配一块足够大的内存,以存放该类的全部实例变量。        分配内存时,alloc 方

baibai_1990的专栏 411
上一篇: objective-c中的 内存管理(六)
下一篇: objective-c中的@property,@synthesize等简易用法(八)
holydancer
博客等级 码龄15年 474粉丝 59原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值