1.封装
屏蔽内部实现的细节, 仅仅对外提供公有的方法/接口
实例变量修饰符
@public
>可以在其它类中访问被public修饰的成员变量
>也可以在本类中访问被public修饰的成员变量
>可以在子类中访问父类中被public修饰的成员变量
@private
>不可以在其它类中访问被private修饰的成员变量
>可以在本类中访问被private修饰的成员变量
>不可以在子类中访问父类中被private修饰的成员变量
@protected
>不可以在其它类中访问被protected修饰的成员变量
>可以在本类中访问被protected修饰的成员变量
>可以在子类中访问父类中被protected修饰的成员变量
注意: 默认情况下所有的实例变量都是protected
@package
>介于public和private之间的
如果是在其它包中(framework外部)访问那么就是private的
如果是在当前代码所在的包(framework内部)访问就是public的
这个特性,很适合用于开发第三方的静态类库,因为多数人并不希望让别人知道自己属性的值。
实例变量修饰符作用域: 从出现的位置开始, 一直到下一个修饰符出现
如果没有遇到下一个实例变量修饰符, 那么就会修饰后面所有的实例变量
2.继承
只要A类继承了B类, 那么A类就拥有了B类的所有属性和方法(对象方法和类方法),可以利用继承来解决当前重复代码太多的问题,缺点是耦合性太强。
3.多态
- 事物的多种表现形态
- 在程序中如何表现:父类指针指向子类对象
- 优点:提高了代码的扩展性
- 注意点:如果父类指针指向子类对象, 如果需要调用子类特有的方法, 必须先强制类型转换为子类才能调用
继承和封装比较常见,就不举例了,下面是多态的例子。
- (void)viewDidLoad
{
[super viewDidLoad];
// 添加子控制器
[self setupChildVc:[[TWFriendsNewsController alloc] init] title:@"朋友圈" image:@"tabBar_essence_icon" selectedImage:@"tabBar_essence_click_icon"];
[self setupChildVc:[[TWFriendsController alloc] init] title:@"好友" image:@"tabBar_friendTrends_icon" selectedImage:@"tabBar_friendTrends_click_icon"];
[self setupChildVc:[[TWBlogViewController alloc] init] title:@"日志" image:@"tabBar_new_icon" selectedImage:@"tabBar_new_click_icon"];
[self setupChildVc:[[TWMeViewController alloc] init] title:@"我的主页" image:@"tabBar_me_icon" selectedImage:@"tabBar_me_click_icon"];
// 更换tabBar
[self setValue:[[TWTabBar alloc] init] forKeyPath:@"tabBar"];
}
/**
* 初始化子控制器
*/
- (void)setupChildVc:(UIViewController *)vc title:(NSString *)title image:(NSString *)image selectedImage:(NSString *)selectedImage
{
// 设置文字和图片
vc.navigationItem.title = title;
vc.tabBarItem.title = title;
vc.tabBarItem.image = [UIImage imageNamed:image];
vc.tabBarItem.selectedImage = [UIImage imageNamed:selectedImage];
// 包装一个导航控制器, 添加导航控制器为tabbarcontroller的子控制器
TWNavigationController *nav = [[TWNavigationController alloc] initWithRootViewController:vc];
[self addChildViewController:nav];
}