小小君的OC第三课

本文介绍了使用Objective-C实现Person、Student及LanOuStudent类的继承过程,包括类的定义、初始化方法、属性设置及自定义行为,并展示了如何在不同层级中正确调用父类方法。

新建Person 、Student 和 LanOuStudent三个类,其中 Student类 继承 Person类 ,LanOuStudent类继承Student类


Person.h 文件:

#import <Foundation/Foundation.h>


@interface Person : NSObject


{

    NSString *_name;       // 姓名

    NSString *_gender;    // 性别

    NSString *_age;       // 年龄

}


// 自定义初始化方法

- (instancetype)initWithName:(NSString *)name

                      Gender:(NSString *)gender

                         Age:(NSString *)age;




+ (instancetype)personWithName:(NSString *)name

                        Gender:(NSString *)gender

                           Age:(NSString *)age;

// set get 方法

- (void)setName:(NSString *)name;


- (NSString *)name;


- (void)setGender:(NSString *)gender;


- (NSString *)gender;


- (void)setAge:(NSString *)age;


- (NSString *)age;

// sayHi方法(介绍自己)

- (void)sayHi;

@end

Person.m文件:


#import "Person.h"


@implementation Person


// 自定义初始化方法

- (instancetype)initWithName:(NSString *)name

                      Gender:(NSString *)gender

                         Age:(NSString *)age

{

    self = [super init];

    if (self) {

        _name = name;

        _gender = gender;

        _age = age;

    }

    

    return self;

}


+ (instancetype)personWithName:(NSString *)name

                        Gender:(NSString *)gender

                           Age:(NSString *)age

{

    Person *p = [Person personWithName:name Gender:gender Age:age];

    return p;

}



// set get 方法

- (void)setName:(NSString *)name

{

    _name = name;

}


- (NSString *)name

{

    return _name;

}


- (void)setGender:(NSString *)gender

{

    _gender = gender;

}


- (NSString *)gender

{

    return _gender;

}


- (void)setAge:(NSString *)age

{

    _age = age;

}


- (NSString *)age

{

    return _age;

}

// sayHi方法(介绍自己)

- (void)sayHi

{

    NSLog(@"姓名:%@  性别:%@  年龄:%@",_name, _gender, _age);

}

@end



Student.h文件:


#import "Person.h"


@interface Student : Person


{

    NSString *_number;    // 学号

}


// 自定义初始化方法

- (instancetype)initWithName:(NSString *)name

                      Gender:(NSString *)gender

                         Age:(NSString *)age

                      Number:(NSString *)number;



+(instancetype)student:(NSString *)name

                Gender:(NSString *)gender

                   Age:(NSString *)age

                Number:(NSString *)number;


// get set 方法

- (void)setNumber:(NSString *)number;


- (NSString *)number;


- (void)sayHiStudent;

@end


Student.m文件:


#import "Student.h"


@implementation Student


- (instancetype)initWithName:(NSString *)name

                      Gender:(NSString *)gender

                         Age:(NSString *)age

                      Number:(NSString *)number

{

    // 继承中的自定义初始化方法

    // 赋值实例变量的时候 需要 先判断一下继承是否成功

    // 也就是调用父类的初始化方法

    self = [super initWithName:name Gender:gender Age:age];

    

    if (self) {

        // 如果继承成功的话就继续初始化子类中特有的实例变量

         _number = number;

    }

    // 继承失败 直接返回就行

    return self;

}



+(instancetype)student:(NSString *)name

                Gender:(NSString *)gender

                   Age:(NSString *)age

                Number:(NSString *)number

{

    Student *stu = [Student student:name Gender:gender Age:age Number:number];

    return stu;

}


- (void)setNumber:(NSString *)number

{

    _number = number;

}


- (NSString *)number

{

   return _number;

}



- (void)hahaha

{

    // 在本类中可以使用关键字 self 当作本类对象 来调用本类的方法

    

    NSLog(@"hahaha");

}


- (void)sayHiStudent

{

    // 调用这个方法 打印全部信息

    // 先去调用 父类方法 sayHi 然后再打印学号 输入完整信息

    // [self hahaha];

    

    // super是一个 编译器指令 可以通过该指令直接跳过本类的方法 直接去调用父类的方法(上一级的父类)

    [super sayHi];

    

    

    NSLog(@"%@", _number);

    

    

}



@end


LanOuStudent.h文件:

#import "Student.h"


@interface LanOuStudent : Student


{

    NSString *_jianChi;

}


- (instancetype)initWithName:(NSString *)name

                      Gender:(NSString *)gender

                         Age:(NSString *)age

                      Number:(NSString *)number

                     Jianchi:(NSString *)jianchi;



// 添加一个类方法 初始化一个对象

// 便利构造器方法

+ (instancetype)lanouStudentWithName:(NSString *)name

                      Gender:(NSString *)gender

                         Age:(NSString *)age

                      Number:(NSString *)number

                     Jianchi:(NSString *)jianchi;


@end



LanOuStudent.m文件:


#import "LanOuStudent.h"


@implementation LanOuStudent


- (instancetype)initWithName:(NSString *)name

                      Gender:(NSString *)gender

                         Age:(NSString *)age

                      Number:(NSString *)number

                     Jianchi:(NSString *)jianchi

{

    self = [super initWithName:name Gender:gender Age:age Number:number];

    if (self) {

        _jianChi = jianchi;

    }

    return self;

}



+ (id)lanouStudentWithName:(NSString *)name

                    Gender:(NSString *)gender

                       Age:(NSString *)age

                    Number:(NSString *)number

                   Jianchi:(NSString *)jianchi

{

    // 初始化对象 并返回

    LanOuStudent *stu = [[LanOuStudent alloc]initWithName:name Gender:gender Age:age Number:number Jianchi:jianchi];

    return stu;

}


@end


main.m文件:

#import <Foundation/Foundation.h>

#import "Person.h"

#import "Student.h"

#import "LanOuStudent.h"


int main(int argc, const char * argv[]) {

    

    

    /*

     继承的特性:

     1.继承是单向的(从上到下)

     2.继承是可传递的

     3.不能相互继承

     4.不能多继承

     5.继承 就是 子类继承父类所有的 实例变量和方法

     

     继承的好处:

     减少代码量  提高工作效率

     

     */

    

    // 创建人类

    // 学生类 继承人类

    // 蓝鸥学生类 继承学生类

    

    Person *person = [[Person alloc]initWithName:@"Q" Gender:@"" Age:@"22"];

    [person sayHi];

    

    Student *stu = [[Student alloc]init];

    // 学生类中本没有init方法 该方法是从基类中继承过来的

    // 通过set方法赋值

    // 学生类本没有name这个实例变量 set方法 现在使用的都是从父类Person类中继承下来的

    [stu setName:@"A"];

    [stu setGender:@""];

    [stu setAge:@"23"];

    [stu setNumber:@"1111"];

    [stu sayHiStudent];

    

    

    // 创建蓝鸥学生对象

    LanOuStudent *lanou = [[LanOuStudent alloc]init];

    [lanou setName:@"W"];

    [lanou setGender:@""];

    [lanou setAge:@"24"];

    [lanou setNumber:@"1234"];

    

    

    // 继承中方法的调用

    // 使用self调用方法的时候

    // 优先调用本类中的方法 没有继续查找上一级

    // 找到就调用 没有就继续查找 都没有 崩溃

    

    // 使用super调用方法的时候

    // 直接跳过本类去查找上一级的父类

    // 找到就调用 没有就继续查找 都没有 崩溃

    

    // super没有特殊的意义 就是一个 编译器指令

    

    

    // 使用类方法初始化一个对象 lanoustudent

    

    

    LanOuStudent *l = [LanOuStudent lanouStudentWithName:@"S" Gender:@"" Age:@"25" Number:@"456" Jianchi:@"坚持"];

    [l sayHiStudent];


    Person *p = [Person personWithName:@"X" Gender:@"" Age:@"26"];

    [p sayHi];

    

    

    return 0;

}







<think>好的,我需要帮助用户找到适用于iOS开发的Swift与Objective-C混合使用的第三方组件。首先,我要回忆常见的第三方库,尤其是那些同时支持两种语言的。Alamofire和AFNetworking是网络请求库,分别对应Swift和OC。SnapKit和Masonry用于自动布局。Kingfisher和SDWebImage处理图片加载。Realm是数据库,支持两者。RxSwift和ReactiveObjC是响应式编程框架。然后,混合使用的注意事项,比如桥接文件的创建,这在引用[2]中提到过。还要注意循环引用的问题,引用[3]中的weakself和strongself处理。最后,推荐工具如CocoaPods和Carthage管理依赖,引用[1]的SonarQube插件可能用于代码分析。需要确保推荐的组件都是常用的,并且给出实际例子和配置方法,比如桥接文件的设置。可能的问题包括如何集成OC库到Swift项目,或者反之,性能优化等。整理这些内容,结构要清晰,分点列出组件和注意事项,最后生成相关问题。</think>### iOS开发中Swift与Objective-C混合使用的第三方组件推荐 在iOS开发中,Swift与Objective-C的混合使用需要依赖兼容性良好的第三方组件。以下是支持混合编程的常用库及其使用场景: --- #### **1. 网络请求** - **Alamofire (Swift)** Swift语言的网络请求库,支持链式调用和异步处理。若需在Objective-C中调用,可通过桥接文件封装接口。 ```swift import Alamofire AF.request("https://api.example.com").responseJSON { response in } ``` - **AFNetworking (Objective-C)** Objective-C经典网络库,Swift可通过桥接文件直接调用。 ```objective-c #import <AFNetworking/AFNetworking.h> [[AFHTTPSessionManager manager] GET:@"https://api.example.com" parameters:nil progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {} failure:nil]; ``` --- #### **2. UI布局** - **SnapKit (Swift)** 基于AutoLayout的Swift布局库,语法简洁。若需在Objective-C中调用,需封装为OC兼容的API。 ```swift view.snp.makeConstraints { make in make.width.equalTo(100) } ``` - **Masonry (Objective-C)** Objective-C的布局库,Swift可通过桥接文件调用。 ```objective-c [view mas_makeConstraints:^(MASConstraintMaker *make) { make.width.equalTo(@100); }]; ``` --- #### **3. 图片加载** - **Kingfisher (Swift)** Swift图片加载库,支持缓存和异步加载。在Objective-C中需通过桥接文件间接使用。 ```swift imageView.kf.setImage(with: URL(string: "https://example.com/image.jpg")) ``` - **SDWebImage (Objective-C)** 广泛使用的Objective-C图片加载库,Swift可直接调用。 ```swift imageView.sd_setImage(with: URL(string: "https://example.com/image.jpg")) ``` --- #### **4. 数据存储** - **Realm** 跨平台数据库,同时支持Swift和Objective-C,需通过CocoaPods或Carthage集成。 ```swift let realm = try! Realm() try! realm.write { realm.add(object) } ``` --- #### **5. 响应式编程** - **RxSwift (Swift) / ReactiveObjC (Objective-C)** 分别对应Swift和Objective-C的响应式编程框架,可通过桥接文件混合使用。 --- ### 混合使用注意事项 1. **桥接文件配置** Swift调用Objective-C组件时,需在桥接文件(如`ProjectName-Bridging-Header.h`)中导入头文件[^2]。 ```objective-c #import "AFNetworking.h" ``` 2. **循环引用处理** 在闭包或Block中使用`weakself`和`strongself`避免循环引用[^3]。 ```swift weak var weakSelf = self api.request { [weak self] in guard let strongSelf = self else { return } strongSelf.updateUI() } ``` 3. **依赖管理工具** - **CocoaPods**:支持Swift/OC库混合集成。 ```ruby pod 'Alamofire', '~> 5.0' pod 'AFNetworking', '~> 4.0' ``` - **Carthage**:通过动态框架集成。 4. **代码静态分析** 使用SonarQube插件(支持Swift/OC)进行代码质量检查[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值