Objective-C语法基础

news2024/11/17 10:47:12
  • 新建一个XCode项目
    在这里插入图片描述
  • 新建一个类

在这里插入图片描述

1、成员变量、属性

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

Role.h

#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

#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

#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

#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

#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

#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

#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

#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

#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、补充:访问修饰复符

#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

#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

#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

#import "Animal.h"

NS_ASSUME_NONNULL_BEGIN

@interface Dog : Animal

@end

NS_ASSUME_NONNULL_END

Dog.m

#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

#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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1882907.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二次封装 el-dialog 实现 全屏和最小化 功能

效果 封装后的组件 <template><el-dialog v-model"dialogVisible" :show-close"false" :fullscreen"fullscreen" draggable overflow><template #header"{ close }"><div><span style"font-weight: b…

ts语法---数据类型,interface和type的用法

ts的数据类型 ts的数据类型自上而下的分级有 第一层 any-任意类型和unknow类型&#xff0c; 第二层 原型链的Object类型&#xff0c; 第三层 js类的类型 第四层 标准的typescript类型 第五层 对应的实例数据类型 第六层 never类型&#xff0c;never表示不合理&#xff0c…

【支撑文档】系统安全保证措施(word原件)

软件安全保证措施word 软件所有全套资料获取进主页或者本文末个人名片直接。

CesiumJS【Basic】- #037 绘制轮廓线(Entity方式)

文章目录 绘制轮廓线(Entity方式)1 目标2 代码2.1 main.ts绘制轮廓线(Entity方式) 1 目标 使用Entity方式绘制轮廓线 2 代码 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium.Viewer(<

DP V2.1a标准学习

一、说明 DP是DisplayPort的简写,是视频电子标准协会(VESA)标准化的数字式视频接口标准,可用于板内芯片之间的连接,也可用于输出接口连接外部设备。DisplayPort是一种基于数据包的可扩展协议,用于传输视频和音频数据。DisplayPort 具有高度可扩展性,并具有保持向后兼容…

vue+js实现鼠标右键页面时在鼠标位置出现弹窗

首先是弹窗元素 <div class"tanchuang move-win1"id"tanchuang1"><el-button>111</el-button></div>然后在需要弹窗的地方监听点击事件&#xff0c;可以将这个方法写在页面载入事件中 // 获取弹窗元素 var tanchuang document.…

MySQL之高可用性(四)

高可用性 故障转移和故障恢复 冗余是很好的技术&#xff0c;但实际上只有在遇到故障需要恢复时才会用到。(见鬼&#xff0c;这可以用备份来实现)。冗余一点儿也不会增加可用性或减少宕机。在故障转移的过程中&#xff0c;高可用性是建立在冗余的基础上。当有一个组件失效&…

STM32系列-时钟系统

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 时钟的时钟源 HSI振荡器时钟HSE振荡器时钟PLL 时钟 STM32中的系统时钟可被内部高速时钟&#xff08;HSI&#xff09;&#xff0c;外部高速时钟&#xff08;HSE&#xff09;和PL…

模型部署:C++libtorch实现全连接模型10分类和卷积模型ResNet18的四分类的模型部署推理

Clibtorch实现模型部署推理 模型 全连接模型&#xff1a;公开mnist手写识别数字的十分类卷积模型&#xff1a;自行采集的鲜花四分类 部署 语言环境&#xff1a;C 对比Python python是解释性语言&#xff0c;效率很慢&#xff0c;安全性很低 系统开发一般是java、C/C&…

示例:WPF中推荐一个Diagram开源流程图控件

一、目的&#xff1a;分享一个自研的开源流程图控件 二、使用方法 1、引用Nuget包&#xff1a; 2、添加节点列表和绘图控件 <DockPanel><ItemsControl DockPanel.Dock"Left"><h:GeometryNodeData Text"节点"/></ItemsControl><…

Magic aura skill VFX(魔法光环技能)

-----魔法光环技能VFX PACK----- 我们为您提供了一种新的高质量资产。MOBA和RPG的理想选择!享受 ------------------------ --------功能---------- 18个粒子预制件 1024*1024 + 512*512效果纹理 适用于VR、PC和移动设备 包括场景 包括后处理 AAA-质量 适用于Unity 2018.3 ===…

Nature 正刊!全球200多位研究人员基于17738个森林样地数据集发现生物多样性可以防止非本地树种的入侵

本文首发于“生态学者”微信公众号&#xff01; 2023年8月23日&#xff0c;由苏黎世联邦理工学院领衔的全球超过200多位研究人员的团队首次探索了地球上哪些地区最容易受到非本地树木的入侵。这项研究以题为“Native diversity buffers against severity of non-native tree i…

安防监控视频平台LntonCVS视频监控汇聚平台视频监控系统组成部分介绍

安防视频监控平台LntonCVS以其强大的拓展性、灵活的视频能力和轻便的部署方式著称。它支持多种主流标准协议&#xff0c;如国标GB28181、RTSP/Onvif、RTMP等&#xff0c;同时也能接入厂家的私有协议和SDK&#xff0c;如海康Ehome、海大宇等设备的SDK。除了传统的安防视频监控功…

【开放词汇分割】Side Adapter Network for Open-Vocabulary Semantic Segmentation

论文链接&#xff1a;Side Adapter Network for Open-Vocabulary Semantic Segmentation 代码链接&#xff1a;https://github.com/MendelXu/SAN 作者&#xff1a;Mengde Xu,Zheng Zhang,Fangyun Wei,Han Hu,Xiang Bai 发表单位&#xff1a;华中科技大学、微软亚洲研究院 会…

CesiumJS【Basic】- #039 绘制渐变线(Entity方式)- 需要自定义着色器

文章目录 绘制渐变线(Entity方式)- 需要自定义着色器1 目标2 代码2.1 main.ts绘制渐变线(Entity方式)- 需要自定义着色器 1 目标 使用Entity方式绘制渐变线 2 代码 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium.Viewer

[工业网络][2] 安全背景知识

安全背景知识 物理、网络和人员安全 在考虑企业和工业的安全性时&#xff0c;安全从业人员传统上将自己划分为三个专业领域。我们借助于安全中经常使用的两个术语来描述这三个领域 业内人士。属于您的设施的人员&#xff0c;包括员工和受邀承包商&#xff0c;访客或交付和服…

docker部署wg-easy和firefly

Background WireGuard是一种新型的VPN协议,它通过在内核层运行,提供高效、安全、简单和现代的VPN解决方案。wg-easy是一个专为简化 WireGuard VPN配置和管理而设计的工具&#xff0c;提供了界面化的管理&#xff0c;进一步降低WireGuard 的使用门槛&#xff0c;让用户无需深入了…

【总线】AXI4第四课时:握手机制详解

大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣&#xff0c;那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者&#xff0c;AXI4以其高性能和高度可扩展性&#xff0c;成为了现代电子系统中不可或缺的通信桥梁…

【大模型系列】Language-Vision Transformer(LaVIT, ICLR2024)

Title&#xff1a;Unified Language-Vision Pretraining in LLM with Dynamic Discrete Visual TokenizationPaper&#xff1a;https://arxiv.org/abs/2309.04669Github&#xff1a;https://github.com/jy0205/LaVITAuthor&#xff1a;Yang Jin&#xff0c; 北大&#xff0c;快…

谈谈创意设计中的AI、AGI、AIGC

在当今的数字化时代&#xff0c;创意设计领域正经历着前所未有的变革。随着人工智能&#xff08;AI&#xff09;、通用人工智能&#xff08;AGI&#xff09;以及人工智能生成内容&#xff08;AIGC&#xff09;的迅猛发展&#xff0c;设计师们的工作方式和创作手段都发生了深刻的…