iOS | OC 类和继承

本文详细介绍了Objective-C中的继承概念,包括如何通过继承创建子类,子类如何访问和重写父类的方法。Objective-C中的根类是NSObject,所有的类都继承自它。在初始化方法中,子类必须在第一行调用`super init`来确保父类的实例变量得到初始化。此外,文章还讨论了指定初始化方法和非指定初始化方法的区别,强调了正确调用父类初始化方法的重要性。
摘要由CSDN通过智能技术生成

继承

通过扩展或者修改既有类来定义新类的方法叫做继承,被继承的类称为父类,通过继承关系新建的类称为子类。

继承意味着子类继承了父类的所有特性,父类的数据成员和成员函数自动称为子类的数据成员和成员函数,子类可以:

  • 追加新的方法
  • 追加新的实例变量
  • 重新定义父类中的方法(重写)

通过继承而彼此关联的类组成的树称为类层次结构,位于类层次最顶端的类称为根类。NSObject是Cocoa环境下的根类。(实际上除了NSObject外,Cocoa环境中还有一个根类NSProxy)

在面向对象的语言中,有的和Objective-C一样有唯一根类,例如:Java,Smalltalk; 有的则不存在唯一根类,例如:C++.

继承的定义:OC中所有类都要继承根类,NSObject是OC中所有类的根类。

@interface 类名: 父类名
{
    实例变量的声明;
}

方法的声明;

@end

子类的定义包含父类接口的头文件是必须的。

子类通过super关键字来发送小心,从而实现父类方法的调用。super和self不同,并不确定指向某个对象,所以super只能被用于调用父类的方法,不能通过super完成赋值,也不能把方法的返回值指定为super.

子类重写父类的初始化方法:

-(id)init
{
    self = [super init]; /* 一定要在第一行调用父类的init放啊父 */
    if (self != nil) {
       //初始化操作
    }
    return self;
}

第一行调用父类的初始化方法可以防止漏掉父类中定义的实例变量的初始化。生成的实例对象的方法alloc会把实例对象的变量都初始化为0(实例变量isa除外)。原则上来说,初始赋值之后值不再发生变化的变量和需要显示设定初值的变量,都需要通过带参数的初始化方法来进行初始化。

继承和方法调用

self指的是收到当前消息的实例变量。super调用的是父类的方法,而至于到底调用那个方法则是有编译时类的继承关系决定的。

指定初始化方法:能确保所有实例变量都能被初始化的方法,是初始化的核心。通常,接收参数最多的初始化方法就是指定初始化方法。子类的制定初始化方法通常是通过向super发送消息来调用超类的指定初始化方法。另外一些通过封装来调用指定初始化方法的方法叫做非指定初始化方法。

如果子类中想重写父类中的指定初始化方法,一定要调用父类的指定初始化方法,如果不小心调用了父类的非指定初始化方法会造成递归循环调用,无法终止。

具体示例:类B继承类A

// 类A
-(id)init
{
    [self initWithMax:10];
    return self;
}

-(id)initWithMax:(int)max
{
    /*
    指定初始化操作
    */
}

// 类B
-(id)initWithMax:(int)max
{
    [super init];
    maximum = max;
    return self;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS 中,可以使用 Objective-C 自定义 TabBar。下面是一个简单的步骤: 1. 创建一个继承自 UITabBarController 的,例如 MyTabBarController。 2. 在 MyTabBarController.m 中,实现 viewDidLoad 方法,在其中创建自定义 TabBar。 ```objc - (void)viewDidLoad { [super viewDidLoad]; // 创建自定义 TabBar MyTabBar *myTabBar = [[MyTabBar alloc] init]; myTabBar.delegate = self; [self setValue:myTabBar forKey:@"tabBar"]; } ``` 3. 在 MyTabBarController.m 中,实现 UITabBarDelegate 协议中的方法,例如 tabBar:didSelectItem:,处理 TabBar 点击事件。 ```objc - (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item { // 处理 TabBar 点击事件 } ``` 4. 创建一个继承自 UITabBar 的,例如 MyTabBar。 5. 在 MyTabBar.m 中,实现 layoutSubviews 方法,在其中布局 TabBar。 ```objc - (void)layoutSubviews { [super layoutSubviews]; // 布局 TabBar } ``` 6. 在 MyTabBar.m 中,实现 drawRect: 方法,在其中绘制 TabBar。 ```objc - (void)drawRect:(CGRect)rect { // 绘制 TabBar } ``` 7. 在 MyTabBar.m 中,实现 touchUpInside 方法,在其中处理 TabBar 点击事件。 ```objc - (void)touchUpInside:(UIButton *)button { // 处理 TabBar 点击事件 } ``` 8. 在 MyTabBar.m 中,添加 TabBar 上的按钮,例如: ```objc - (void)layoutSubviews { [super layoutSubviews]; // 添加 TabBar 上的按钮 UIButton *button1 = [UIButton buttonWithType:UIButtonTypeCustom]; button1.frame = CGRectMake(0, 0, self.frame.size.width / 4, self.frame.size.height); [button1 addTarget:self action:@selector(touchUpInside:) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:button1]; UIButton *button2 = [UIButton buttonWithType:UIButtonTypeCustom]; button2.frame = CGRectMake(self.frame.size.width / 4, 0, self.frame.size.width / 4, self.frame.size.height); [button2 addTarget:self action:@selector(touchUpInside:) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:button2]; UIButton *button3 = [UIButton buttonWithType:UIButtonTypeCustom]; button3.frame = CGRectMake(self.frame.size.width / 2, 0, self.frame.size.width / 4, self.frame.size.height); [button3 addTarget:self action:@selector(touchUpInside:) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:button3]; UIButton *button4 = [UIButton buttonWithType:UIButtonTypeCustom]; button4.frame = CGRectMake(self.frame.size.width * 3 / 4, 0, self.frame.size.width / 4, self.frame.size.height); [button4 addTarget:self action:@selector(touchUpInside:) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:button4]; } ``` 9. 在 MyTabBar.m 中,重写 setItems:animated: 方法,在其中设置 TabBar 上按钮的图标和标题。 ```objc - (void)setItems:(NSArray<UITabBarItem *> *)items animated:(BOOL)animated { [super setItems:items animated:animated]; // 设置 TabBar 上按钮的图标和标题 for (int i = 0; i < items.count; i++) { UITabBarItem *item = items[i]; UIButton *button = self.subviews[i + 1]; [button setImage:item.image forState:UIControlStateNormal]; [button setTitle:item.title forState:UIControlStateNormal]; [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; } } ``` 以上就是使用 Objective-C 自定义 TabBar 的简单步骤。当然,还可以根据需求进行更详细的定制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值