正确地编写Objective-C中的便捷方法
在Objective-C中,如果某个类方法的返回类型就是这个类的实例(例如NSString类中的stringWithFormat:),就可以将这种类方法称为便捷方法(Convenience Method)。简单一点来就,就是相当于C#中的静态方法创建实例,我们经常给这样的函数命名为CreateInstance。主要的作用是根据上下文的需求,创建符合应用的实例,避免通过构造函数创建不符合需求的实例。
所以,在C#中,这样的函数经常是这么写的。
1 2 3 4 5 6 7 8 | public static Employee CreateInstance () { // 这里可以通过检查上下文或者运行环境,为实例设置不同类实体或设置实例的属性值,在这里进行省略 return new Employee(){ Name = "Unknow" , Age = 20 }; } |
在Objective-C中,也可以创建这样的函数。它的写法可以是这样的。
1 2 3 | +( id )createInstance{ return [[ self alloc]initWithName:@ "Unknown" andAge:20]; } |
不过,在写法上,可能有点不大一样,注意到两段代码中的区别,就是在Objective-C中,不是直接使用[[Employee alloc]initWithName:@"Unknown" andAge:20]]创建实例,而是使用了self,这里就有点问题的,self不是跟C#中的this一样吗?指向的不是实例吗?而这里的便捷方法是类方法,不是实例方法啊?那么在这里使用self是否正确呢?
原来,在Objective-C中,self的概念跟C#中的this是不大一样的?C#中的this就是严格指向了类实例,而Objective-C中的self是会根据上下文的而改变的。因为方法本身是类方法,不是实例方法,所以self是指Employee类自身,而不是实例。在便捷方法中,应用使用self,而不是直接使用类的类名。这样的话,子类也能使用父类的便捷方法,不至于发生错误。以Employee为例,如果有一个子类Manager的话,那么可以直接向这个子类发送createInstance消息。使用self时,便捷方法会根据收到iithr类来创建相应的实例,并将新实例的isa指针指向这相类。因此,在Manager中,可以重写createInstance方法。
1 2 3 4 5 | +( id )createInstance{ Manager *manager = [ super createInstance]; manager.payment = 100.0f; return manager; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库