Objective-C语法基础

注:编译器版本 XCode 15.4

  • 新建一个XCode项目
  • 新建一个类

1、成员变量、属性

1.1、类内使用成员变量,类外使用属性

Role.h

objectivec 复制代码
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Role : NSObject
{
    //成员变量:只能类内使用
    NSString *_name;
    int _age;
}


//属性:类外可使用
//属性就是内部成员变量的外部接口
@property (nonatomic, strong) NSString *name;

//属性也相当于 get/set 方法
-(void)setAge:(int)age;
-(int)getAge;

-(void)display;

@end

NS_ASSUME_NONNULL_END

Role.m

objectivec 复制代码
#import "Role.h"

@implementation Role


//绑定属性和成员变量
//推荐使用成原变量与属性不同命的方式,成员变量前面加_,属性不加
@synthesize name = _name;


//构造方法
- (instancetype)init
{
    self = [super init];
    if (self) {
        //类内调用的都是成员变量
        _name = @"";
        _age = 0;
    }
    return self;
}



-(void)setAge:(int)age{
    _age = age;
}

-(int)getAge{
    return _age;
}


-(void)display{
    NSLog(@"角色名称: %@    角色年龄: %d", _name, _age);
}


@end

main.m

objectivec 复制代码
#import <Foundation/Foundation.h>
#import "Role.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        
        //实例化对象(* 代表指针)
        //[类名 方法名]
        //[对象名 方法名]
        //alloc:为对象分配内存空间
        //init:初始化操
        Role *r1 = [[Role alloc]init];
        [r1 display]; //角色名称:     角色年龄: 0
        
        
        [r1 setName:@"琦玉"];
        [r1 setAge:20];
        [r1 display];  //角色名称: 琦玉    角色年龄: 20
        
        //属性可以直接当做get/set用
        r1.name = @"杰诺斯";
        NSLog(@"角色名称: %@", r1.name);  //角色名称: 杰诺斯
    }
    return 0;
}

1.2、补充

Role2.h

objectivec 复制代码
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Role2 : NSObject

//新版本中只需声明 属性,便会自动生成 对应的成员变量(如属性 name,便会自动生成成员变量 _name)
@property (nonatomic, strong) NSString *name;
@property () int age;


-(void)display;


-(void)setSex:(NSString *)sex;
-(NSString *)getSex;

@end

NS_ASSUME_NONNULL_END

Role2.m

objectivec 复制代码
#import "Role2.h"

@implementation Role2

//新版xCode可以在 .m 文件中声明成员变量
{
    NSString *_sex;
}

- (instancetype)init
{
    self = [super init];
    if (self) {
        _name = @"";
        _age = 0;
        _sex = @"";
    }
    return self;
}

-(void)display{
    NSLog(@"角色名称: %@    角色年龄: %d    角色性别: %@", _name, _age, _sex);
}

-(void)setSex:(NSString *)sex{
    _sex = sex;
}

-(NSString*)getSex{
    return _sex;
}

@end

main.m

objectivec 复制代码
#import <Foundation/Foundation.h>
#import "Role2.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
    
        Role2 *r2 = [[Role2 alloc]init];
        r2.name = @"地狱吹雪";
        r2.age = 26;
        [r2 setSex:@"女"];
        [r2 display];  //角色名称: 地狱吹雪    角色年龄: 26    角色性别: 女
    }
    return 0;
}

2、方法

2.1、对象方法、类方法

Role3.h

objectivec 复制代码
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Role3 : NSObject



// - 代表对象方法,用对象名调用
-(void)setName:(NSString*)name;
-(NSString*)getName;
-(void)objectFun:(NSString*)name andCom:(NSString*)company;
-(void)objectReport;
// + 代表类方法,用类名调用
+(void)setCompany:(NSString*)company;
+(NSString*)getCompany;
+(void)classFun:(NSString*)name andCom:(NSString*)company;
+(void)classReport;



//初始化方法,重写init
//对于初始化方法,id和instancetype没有区别
//对于其他方法,填id可能会导致类型错误
//instancetype代表当前类的类型,当前类型是 Role3,那么instancetype就是Role3类型
-(instancetype)init;
//id可以代表任意类型,无需指定特定类型
-(id)init2;

//自定义构造方法
-(id)initWithName:(NSString*)name andCompany:(NSString*)company;

@end

NS_ASSUME_NONNULL_END

Role3.m

objectivec 复制代码
#import "Role3.h"

@implementation Role3

{
    NSString *_name;
}


//静态变量
static NSString *_company;


-(void)setName:(NSString *)name{
    _name = name;
}


-(NSString*)getName{
    return _name;
}

-(void)objectFun:(NSString *)name andCom:(NSString *)company{
    //对象方法中,可以使用成员变量、静态变量
    _name = name;
    _company = company;
}


-(void)objectReport{
    NSLog(@"对象方法objectReport--- 角色名称:%@   角色公司: %@", _name, _company);
    //对象方法中调类方法,防止循环调用,暂时注释掉
//    [Role3 classReport];
}


+(void)setCompany:(NSString *)company{
    _company = company;
}

+(NSString*)getCompany{
    return _company;
}


+(void)classFun:(NSString *)name andCom:(NSString *)company{
    //类方法中只能调用静态变量
    _company = company;
}


+(void)classReport{
    NSLog(@"类方法classReport --- 角色公司: %@", _company);
    //类方法中调对象方法,防止循环调用,暂时注释掉
//    [[Role3 alloc]objectReport];
}


-(instancetype)init{
    self = [super init];
    if (self) {
        _name = @"name";
        _company = @"company";
    }
    return self;
}


-(id)init2{
    self = [super init];
    if (self) {
        _name = @"name2";
        _company = @"company2";
    }
    return self;
}


-(id)initWithName:(NSString *)name andCompany:(NSString *)company{
    self = [super init];
    if (self) {
        _name = name;
        _company = company;
    }
    return self;
}

@end

main.m

objectivec 复制代码
#import <Foundation/Foundation.h>
#import "Role3.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
    
        Role3 *r31 = [[Role3 alloc]init];
        [r31 objectReport];  //对象方法objectReport--- 角色名称:name   角色公司: company
        Role3 *r32 = [[Role3 alloc]init2];
        [r32 objectReport];  //对象方法objectReport--- 角色名称:name2   角色公司: company2
        Role3 *r33 = [[Role3 alloc]initWithName:@"战栗龙卷" andCompany:@"英雄协会"];
        [r33 objectReport];  //对象方法objectReport--- 角色名称:战栗龙卷   角色公司: 英雄协会
        
        [r33 objectFun:@"饿狼" andCom:@"怪人协会"];
        [r33 objectReport];  //对象方法objectReport--- 角色名称:饿狼   角色公司: 怪人协会
        
        
        [Role3 classReport];  //类方法classReport --- 角色公司: 怪人协会
        [Role3 classFun:@"邦古" andCom:@"英雄协会"];
        [Role3 classReport];  //类方法classReport --- 角色公司: 英雄协会
        [r33 objectReport];  //对象方法objectReport--- 角色名称:饿狼   角色公司: 英雄协会
        
    }
    return 0;
}

2.2、补充:访问修饰复符

objectivec 复制代码
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface MyClass : NSObject
{
    //成员变量访问修饰复符
    //@public,类内类外均可使用
    //@private,类内可用,类外不可用,不可继承
    //@protected,默认为受保护的,类内可用,类外不可用,可继承
    //@package,框架权限,在框架内相当于受保护,在框架外相当于私有(常用于写三方库)
    
    @public
    int _classInt;
    
    
}

//属性实质上是set和get方法,而不是把成员变量便为公有
@property(nonatomic,strong)NSString *className;

//方法没有访问修饰符
- (void)report;

@end

NS_ASSUME_NONNULL_END

3、继承、多态

  • 多态:方法重写,方法重载(函数名相同,参数不同)
  • OC中不支持方法重载

Animal.h

objectivec 复制代码
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Animal : NSObject

{
    @protected
    NSString* _category;
}
@property (nonatomic, strong) NSString* category;


-(instancetype)initWithCategory:(NSString*)category;


-(void) howl;


@end

NS_ASSUME_NONNULL_END

Animal.m

objectivec 复制代码
#import "Animal.h"

@implementation Animal

@synthesize category = _category;

-(instancetype)initWithCategory:(NSString *)category{
    self = [super init];
    if (self) {
        _category = @"动物";
    }
    return self;
}


-(void)howl{
    NSLog(@"我是%@, 我会叫", _category);
}

@end

Dog.h

objectivec 复制代码
#import "Animal.h"

NS_ASSUME_NONNULL_BEGIN

@interface Dog : Animal

@end

NS_ASSUME_NONNULL_END

Dog.m

objectivec 复制代码
#import "Dog.h"

@implementation Dog


//方法重写
-(instancetype)initWithCategory:(NSString *)category{
    self = [super init];
    if (self) {
        _category = category;
    }
    return self;
}


//方法重写
- (void)howl{
    NSLog(@"我是%@, 汪汪汪", _category);
}

@end

main.m

objectivec 复制代码
#import <Foundation/Foundation.h>
//Dog.h 中已经引用了Animal.h,所以此处可以不写Animal.h的引用
#import "Dog.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
      
        Animal *animal = [[Animal alloc]initWithCategory:@"动物"];
        [animal howl];  //我是动物, 我会叫
        Dog *dog = [[Dog alloc]initWithCategory:@"狗"];
        [dog howl];  //我是狗, 汪汪汪
        
    }
    return 0;
}
相关推荐
若水无华1 天前
fiddler 配置ios手机代理调试
ios·智能手机·fiddler
Aress"2 天前
【ios越狱包安装失败?uniapp导出ipa文件如何安装到苹果手机】苹果IOS直接安装IPA文件
ios·uni-app·ipa安装
Jouzzy2 天前
【iOS安全】Dopamine越狱 iPhone X iOS 16.6 (20G75) | 解决Jailbreak failed with error
安全·ios·iphone
瓜子三百克2 天前
采用sherpa-onnx 实现 ios语音唤起的调研
macos·ios·cocoa
左钦杨2 天前
IOS CSS3 right transformX 动画卡顿 回弹
前端·ios·css3
努力成为包租婆2 天前
SDK does not contain ‘libarclite‘ at the path
ios
安和昂3 天前
【iOS】Tagged Pointer
macos·ios·cocoa
I烟雨云渊T3 天前
iOS 阅后即焚功能的实现
macos·ios·cocoa
struggle20253 天前
适用于 iOS 的 开源Ultralytics YOLO:应用程序和 Swift 软件包,用于在您自己的 iOS 应用程序中运行 YOLO
yolo·ios·开源·app·swift
Unlimitedz3 天前
iOS视频编码详细步骤(视频编码器,基于 VideoToolbox,支持硬件编码 H264/H265)
ios·音视频