Objective-C类设计与内存管理详解

21、你新创建的初始化方法中必须有一个是该类的指定初始化方法。应该选择哪一个呢?

指定初始化方法通常是参数最多或者在设置对象时执行最多工作的初始化方法。对于不需要带参数的初始化方法的类,指定初始化方法是 init

22、在类的初始化过程中,对于初始化器的调用有什么要求?

在设计类的初始化器时,所有其他类初始化器必须最终调用该类(而非超类)的 指定初始化器

  • 指定初始化器 是能完全初始化类实例的初始化器,通常是参数最多或在设置对象时执行最多工作的初始化器。

例如, TeeShirt 类中, initWithShirtSize: 调用了指定初始化器 initWithShirtSize:color:

  • 并且,类的 指定初始化器 必须调用其超类的 指定初始化器 ,这是唯一调用超类指定初始化器的初始化器。

23、别忘了修复初始化方法。

该表述提醒开发者对初始化方法进行检查和修正,确保其能正确初始化对象,避免初始化失败或出现内存管理问题。

在初始化方法里,要做好非 dealloc 处理的清理工作,释放对象并返回 nil 以表明初始化失败,同时要保证在失败点调用类的 dealloc 方法是安全的。

24、假设你有一个抽象类Dog,以及它的子类AmericanDog、JapaneseDog和ItalianDog。你需要编写一小段代码来记录狗的叫声。以下代码有什么问题(这是一个设计问题,而非语法问题):Dog *myDog = … if ( [myDog isMemberOfClass: [AmericanDog class]] ) { NSLog(“woof woof”); } else if ( [myDog isMemberOfClass: [JapaneseDog class]] ) { NSLog(“wan wan”); } else if ( [myDog isMemberOfClass: [ItalianDog class]] ) { NSLog(“bau bau”); } 如何改进这个设计?如果添加一个FrenchDog子类,旧版本和新版本的代码需要如何修改?

原代码的问题在于违反了开闭原则,当添加新的狗子类时,需要修改原有的判断逻辑。

改进设计方案:

  1. Dog 类中定义一个抽象方法,如 -bark
  2. 在每个子类中实现该方法,返回对应狗的叫声。

对比分析:

  • 旧版本代码 :添加 FrenchDog 子类时,需新增一个 else if 分支判断。
  • 新版本代码 :只需在 FrenchDog 子类中实现 -bark 方法,调用时直接使用 [myDog bark] 即可。

25、在练习3的程序中,将Coupon和NewCoupon类的版本替换为能够独立记录它们剩余优惠券数量的

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值