• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

正确地编写Objective-C中的便捷方法

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

在Objective-C中,如果某个类方法的返回类型就是这个类的实例(例如NSString类中的stringWithFormat:),就可以将这种类方法称为便捷方法(Convenience Method)。简单一点来就,就是相当于C#中的静态方法创建实例,我们经常给这样的函数命名为CreateInstance。主要的作用是根据上下文的需求,创建符合应用的实例,避免通过构造函数创建不符合需求的实例。

所以,在C#中,这样的函数经常是这么写的。

		public static Employee CreateInstance ()
		{
                        // 这里可以通过检查上下文或者运行环境,为实例设置不同类实体或设置实例的属性值,在这里进行省略
			return new Employee(){
				Name = "Unknow",
				Age = 20
			};
		}

 

 在Objective-C中,也可以创建这样的函数。它的写法可以是这样的。

+(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方法。

+(id)createInstance{
    Manager *manager  = [super createInstance];
    manager.payment = 100.0f;
    return manager;
}

 

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
iOS - 逆向 - Objective-C代码混淆 -confuse.sh文件写法发布时间:2022-07-12
下一篇:
iOS(Objective-C)开发的系统框架发布时间:2022-07-12
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap