《从零开始学iOS7开发系列3-我的地盘我做主-Cha13》.pdf
文本预览下载声明
从零开始学iOS7开发系列3-我的地盘我做主-Cha13
原⽂及⽰例代码来⾃raywenderlich store中的iOS Apprentice 系列3教程,经过翻译和改编。
版权归原作者所有,本系列教程仅供学习参考使⽤,感兴趣的朋友建议购买原英⽂教程教程(The
iOS Apprentice Second Edition: Learn iPhone and iPad Programming via Tutorials!)。
购买链接:
/store
最近的天⽓好冷,这就是传说中的倒春寒吧?⼤家还是要多注意⾝体,⼩⼼感冒哦~
欢迎继续我们的学习。
让我们把理论知识进⾏到底吧。
⾸先来了解下Overriding methods (⽅法覆盖/重写)的概念。
为什么会有这样⼀个概念的存在呢?这个其实和我们上⼀课提到的类继承机制有关。当我们通过类
继承的⽅式创建⼀个⾃定义类时,这个⾃定义的类也会继承来⾃⽗类的⽅法。
⽐如我们创建了⼀个新类MyClass:
@interface MyClass : NSObject
@end
那么在后⾯的代码中就可以这样来分配并初始化⼀个MyClass类的实例对象:
MyClass *myObject = [[MyClass alloc] init];
即便我们的MyClass类中没有显⽰声明⼀个alloc⽅法或⼀个init⽅法,上⾯的代码仍然是有效的。因
为MyClass类继承⾃NSObject类,⽽NSObject类具有这样的⽅法,这就⾏了。也就是说MyClass类
会免费拥有NSObject类的所有⽅法。这充分说明了作为⼀个可以继承⼤量财富的富⼆代是多么的令
⼈羡慕。⼟豪,我们做朋友吧!
继承来的财富不⼀定让⼟豪满意,⽐如祖上虽然有庞⼤的产业,但主要收⼊来源是东莞的五星级酒
店和娱乐场所。作为⼀个有良知尊重妇⼥的富⼆代,你可能会考虑弃暗投明,升级产业转⽽搞⽐较
有节操的⼿机游戏。⽐如可以考虑设计⼀个疯狂美少⼥游戏,充分利⽤旗下的美⼥资源,把她们的
形象卡通化。玩家把美少⼥架在树上,可以攻击那些猪⼀样的猿类。弹指⼀挥间,强撸灰⻜烟灭。
因此,我们的MyClass类可能想要拥有⾃⼰的init⽅法:
@implementation MyClass
- (id)init {
if ((self = [super init])) {
// do stuff
}
return self;
}
@end
从此之后,如果后⾯在代码中调⽤[[MyClass alloc]init] ,就会触发这个新的init⽅法。
当然,在这个过程中我们还是需要调⽤NSObject版本的init⽅法,这样⽗类才可以初始化⾃⼰,这也
是为神⻢在上⾯的⾃定义init⽅法的if条件语句中有[super init]。
想想也是,如果没有⽗辈的启动资⾦,你也没机会搞神⻢产业升级。
当然,我们⽆需在interface部分单独声明init⽅法:
@interface MyClass : NSObject
- (id)init; // not needed
@end
当然,如果你这么做也没有坏处,不过会让代码显得多余,因为在NSObject类的interface中已经声
明了init⽅法。既然MyClass类继承⾃NSObject类,那么它⾃然就知道⾃⼰拥有⼀个init⽅法。
当然,如果我们使⽤其它名称创建了⼀个初始化⽅法,那么就需要在interface部分添加⼀个⽅法声
明,否则其它类就⽆法使⽤它。
@interface MyClass: NSObject
-(id)initWithText:(NSString *)text;
@end
⽅法可以⽤于⽗类和其⼦类之间的通讯,这样⼦类就可以在特定的情况下执⾏特定的⾏为。这也是
诸如viewDidLoad和viewWillAppear:⽅法的⺫的。这些⽅法在UIViewController中声明和实现,⽽在
我们⾃⼰创建的⾃定义视图控制器⼦类中则可以override (覆盖/重写)。
例如,当⽤户界⾯将要呈现时,UIViewController类会调⽤[self viewW
显示全部