Objective-C语法基础

注:编译器版本 XCode 15.4
在这里插入图片描述

  • 新建一个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;@endNS_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;@endNS_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;@endNS_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   角色公司: companyRole3 *r32 = [[Role3 alloc]init2];[r32 objectReport];  //对象方法objectReport--- 角色名称:name2   角色公司: company2Role3 *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,框架权限,在框架内相当于受保护,在框架外相当于私有(常用于写三方库)@publicint _classInt;}//属性实质上是set和get方法,而不是把成员变量便为公有
@property(nonatomic,strong)NSString *className;//方法没有访问修饰符
- (void)report;@endNS_ASSUME_NONNULL_END

3、继承、多态

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

Animal.h

#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@interface Animal : NSObject{@protectedNSString* _category;
}
@property (nonatomic, strong) NSString* category;-(instancetype)initWithCategory:(NSString*)category;-(void) howl;@endNS_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@endNS_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.mzph.cn/pingmian/40725.shtml

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

相关文章

Ubuntu18.04安装AutoWare.ai(完整版)

目录 目录 一、安装Opencv 1.1 下载安装包Opencv官网 1.2 安装opencv_contrib 二、安装Eigen库 1. 解压文件 2. 安装Eigen 3. 配置路径&#xff1a; 三、安装Ros和rosdepc 四、安装Autoware.ai-1.14.0 4.1 安装依赖 4.2 下载Autoware.ai 1.在home路径下打开终端输…

RUP开发模型-系统架构师(二十三)

1、RUP是一个二维软件开发模型&#xff0c;其核心特点之一是&#xff08;&#xff09;。RUP将软件开发周期划分多个循环&#xff0c;每个循环由4个连续阶段组成&#xff0c;每个阶段完成确定的任务。设计及确定系统的体系结构&#xff0c;制定工作计划及资源要求在&#xff08;…

【AI学习】无线AI的问题和挑战

无线AI&#xff0c;即无线人工智能&#xff0c;是指内生于未来&#xff08;6G&#xff09;无线通信系统并通过无线架构、无线数据、无线算法和无线应用所呈现出来的新的人工智能技术体系。 最近一直在进行无线AI的调研&#xff0c;感觉真的是路漫漫其修远兮。业界有一些探索&a…

CVPR 2024最佳论文:“神兵”的组合器 Generative Image Dynamics

CVPR 2024的最佳论文来自谷歌、美国加州大学圣迭戈分校。两篇都来至于视频生成领域&#xff0c;可见今年外界对视频生成领域关注度很高。今天的这篇是“Generative Image Dynamics”&#xff0c;Google Research发布的。它的研究成果令人震惊&#xff0c;从单张RGB图像生成连续…

远程监控在工业机械安全操作中的应用——以汽车起重机为例

远程监控技术&#xff0c;作为现代信息技术的重要分支&#xff0c;正逐渐在各个领域展现其独特的价值。从字面上理解&#xff0c;远程监控可以分为“监”和“控”两部分&#xff1a;其中&#xff0c;“监”指的是通过网络进行信息的获取与传递&#xff0c;实现远程状态的实时感…

stm32——定时器级联

在STM32当中扩展定时范围&#xff1a;单个定时器的定时长度可能无法满足某些应用的需求。通过级联&#xff0c;可以实现更长时间的定时&#xff1b;提高定时精度&#xff1a;能够在长定时的基础上&#xff0c;通过合理配置&#xff0c;实现更精细的定时控制&#xff1b;处理复杂…

【后端面试题】【中间件】【NoSQL】MongoDB查询过程、ESR规则、覆盖索引的优化

任何中间件的面试说到底都是以高可用、高性能和高并发为主&#xff0c;而高性能和高并发基本是同时存在的。 性能优化一直被看作一个高级面试点&#xff0c;因为只有对原理了解得很透彻的人&#xff0c;在实践中才能找准性能优化的关键点&#xff0c;从而通过各种优化手段解决性…

【营销策划模型大全】私域运营必备

营销策划模型大全&#xff1a;战略屋品牌屋、电商运营模型、营销战略、新媒体运营模型、品牌模型、私域运营模型…… 该文档是一份策划总监工作模型的汇总&#xff0c;包括战略屋/品牌屋模型、营销战略模型、品牌相关模型、电商运营模型、新媒体运营模型和私域运营模型等&…

【你真的了解double和float吗】

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a;基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 …

Buuctf之不一样的flag(迷宫题)

首先&#xff0c;进行查壳无壳&#xff0c;32bit&#xff0c;丢进ida32中进行反编译进入main函数&#xff0c;对其进行分析&#xff0c;可以在一旁打上注释&#xff0c;这边最关键的一个点就是&#xff0c;需要联想到这是一个迷宫题&#xff0c;很小的迷宫题&#xff0c;迷宫就…

(十三)MipMap

MipMap概念 滤波 采样 mipmap级别判定 问题&#xff1a;opengl如何判定应该使用下一级的mipmap呢&#xff1f; 通过glsl中的求偏导函数计算变化量决定 手动实现mipmap原理 1、生成mipmap的各个级别 2、修改vertexShader使得三角形随着时间变小 **** 需要更改Filter才能…

事务底层与高可用原理

1.事务底层与高可用原理 事务的基础知识 mysql的事务分为显式事务和隐式事务 默认的事务是隐式事务 显式事务由我们自己控制事务的开启&#xff0c;提交&#xff0c;回滚等操作 show variables like autocommit; 事务基本语法 事务开始 1、begin 2、START TRANSACTION&…

透过 Go 语言探索 Linux 网络通信的本质

大家好&#xff0c;我是码农先森。 前言 各种编程语言百花齐放、百家争鸣&#xff0c;但是 “万变不离其中”。对于网络通信而言&#xff0c;每一种编程语言的实现方式都不一样&#xff1b;但其实&#xff0c;调用的底层逻辑都是一样的。linux 系统底层向上提供了统一的 Sock…

三菱PLC标签使用(I/O的映射)与内容

今天&#xff0c;小编继续开始三菱PLC的学习&#xff0c;今天的内容是标签及其标签的内容说明&#xff0c;如果对你有帮助&#xff0c;欢迎评论收藏。 标签的种类&#xff0c;等级&#xff0c;定义 种类 三菱3U的PLC的种类分别为二种&#xff1a;全局标签与局部标签 全局标签…

操作审计(一)

操作审计&#xff08;一&#xff09; 前言一、快速查询事件二、高级查询事件总结 前言 这里主要记录操作审计的过程&#xff0c;操作审计其实就是监控并记录阿里云账号的活动&#xff0c;可以使用阿里云的操作审计服务来审计最近90天阿里云账号下的操作&#xff0c;从而确保云…

RKNN3588——YOLOv8的PT模型转RKNN模型

一&#xff1a;PT转ONNX 1. 首先克隆rknn修改后的ultralytics版本项目到本地 https://github.com/airockchip/ultralytics_yolov8 cd ultralytics-main pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple pip install -e . 主要是修改了源码的ul…

PhpStorm 2024 for Mac PHP集成开发工具

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff08;适合自己的M芯片版或Intel芯片版&#xff09;&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功3、打开访达&#xff0c;点击【文…

如何在TikTok上获得更多观看量:12个流量秘诀

TikTok作为热门海外社媒&#xff0c;在跨境出海行业中成为新兴的推广渠道&#xff0c;但你知道如何让你的TikTok赢得更多关注次数吗&#xff1f;如果您正在寻找增加 TikTok 观看次数的方法&#xff0c;接下来这12种策略&#xff0c;你需要一一做好&#xff01; 1. 在内容中添加…

HQ-SAM

不建议复现

鸿蒙开发设备管理:【@ohos.update (升级)】

升级 说明&#xff1a; 本模块首批接口从API version 6开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 升级范围&…