Objective-C 中类和对象的基本使用 方法的调用(消息传递)

news2024/11/29 6:30:00

总目录 iOS开发笔记目录 从一无所知到入门

文章目录

    • Intro
    • 截图
      • 自定义类型的`@interface`部分和`@implementation`部分
      • main方法中的类型调用部分
    • Demo
      • 测试代码
      • 输出

Intro

Objective-C,具有面向对象特性的C。
但其实,它的面向对象和其他高级语言相比,还是有很大的差异【OC的面向对象是来自于另一种较为古早的编程语言smalltalk的消息传递】。
每次点到一些iOS项目里都能看到那些奇怪的我不懂的语法,所以如果自己真心实意想开发iOS程序,Objective- C的面向对象部分的语法还是要仔细过一下。

以下代码包含:

  • 如何自定义一个新类型? @interface 和 @implementation 两部分。
  • @interface 的基本组成(可以有,不是必须有): 成员属性、成员方法/对象方法的声明、类方法的声明。
  • @implementation 的基本组成: 类的实现。
  • 如何声明并实例化一个对象?
  • 如何读写对象的某个成员属性值?通过箭头符号。
  • 无参数、无返回值的方法的声明和调用。
  • 含有多个参数的方法的声明写法和调用方法。
  • 对象方法和类方法的调用区别。

截图

自定义类型的@interface部分和@implementation部分

在这里插入图片描述

main方法中的类型调用部分

在这里插入图片描述

Demo

测试代码

//
//  main.m
//  类和对象的基本使用
//
//  Created by wuyujin1997 on 2023/2/23.
//

#import <Foundation/Foundation.h>

// 类型定义(包含成员属性、方法定义的接口)
@interface Person : NSObject {
    @public
    NSString* name;
    int age;
}
- (void) sayHi;     // 无参数、无返回值的方法声明。
- (NSString*) toString; // 无参数、有返回值的方法声明。
- (int) sumWithNumA:(int)a numB:(int)b;     // 有返回值、且有多个参数(推荐写法)。
- (int) sumFourNum:(int)a :(int)b :(int)c numD:(int)d; // 多个参数的情况下,可以省略部分参数的名称(不推荐)。
// 减号-开头表示是成员方法,由对象调用。
// 加号+开头表示是类方法,可以直接由类名调用。
+ (Person*) createPersonWithName:(NSString*)name age:(int)age;
@end

// 类的实现(包含方法的具体实现)
@implementation Person

- (void) sayHi {
    NSLog(@"hello wuyujin1997");
}

- (NSString*) toString {
    // 将多个参数拼接、格式化为一个字符串对象
    NSString* resultStr = [NSString stringWithFormat:@"Name:%@  Age:%d", name, age];
    return resultStr;
}

- (int) sumWithNumA: (int)a numB: (int)b {
    return a + b;
}

- (int) sumFourNum:(int)a :(int)b :(int)c numD:(int)d {
    return a + b + c + d;
}

+ (Person*) createPersonWithName:(NSString*)name age:(int)age {
    Person* person = [Person new];
    person->name = name;
    person->age = age;
    return person;
}

@end

int main(int argc, const char * argv[]) {
    // 实例化一个对象并赋值
//    Person* person = [[Person alloc] init];
    Person* person = [Person new];
    // 对象调用方法,准确的说:【向对象传递消息】。
    [person sayHi];
    
    // 对象指针如何调用成员?使用【箭头符号】。
    person->name = @"wuyujin1997";      // 如何写一个成员属性?
    NSLog(@"name: %@", person->name);   // 如何读一个成员属性?
    person->age = 26;
    // 调用一个有返回值的成员方法
    NSString* personInfo = [person toString];
    NSLog(personInfo);
    
    // 调用一个有返回值、且有多个参数的方法。
    int resultValue = [person sumWithNumA:10 numB:22];
    NSLog(@"sum result: %d", resultValue);
    
    // 调用某个含多个参数的函数(该只有部分参数有参数名、部分参数没有参数名)
    int sumResult = [person sumFourNum:2 :4 :6 numD:8];
    NSLog(@"sum result: %d", sumResult);
    
    // 类方法调用测试
    Person* p = [Person createPersonWithName:@"张三" age:22];
    NSLog([p toString]);
    
    return 0;
}

输出

2023-02-23 22:38:17.083168+0800 类和对象的基本使用[9370:284964] hello wuyujin1997
2023-02-23 22:38:17.083366+0800 类和对象的基本使用[9370:284964] name: wuyujin1997
2023-02-23 22:38:17.083407+0800 类和对象的基本使用[9370:284964] Name:wuyujin1997  Age:26
2023-02-23 22:38:17.083422+0800 类和对象的基本使用[9370:284964] sum result: 32
2023-02-23 22:38:17.083433+0800 类和对象的基本使用[9370:284964] sum result: 20
2023-02-23 22:38:17.083452+0800 类和对象的基本使用[9370:284964] Name:张三  Age:22
Program ended with exit code: 0

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

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

相关文章

【C++】C++的内存模型之四大分区

程序的内存模型 C程序在执行时&#xff0c;将内存大方向划分为4个区域 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理的全局区&#xff1a;存放全局变量和静态变量以及常量栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数值&…

CIMCAI intelligent tally shore AI auto container damage detect

全球港航人工智能/集装箱人工智能领军者CIMCAI&#xff0c;世界首创港口岸边超级智能理货产品自动化AI验箱&#xff0c;AI自动化码头港口数字化港口。中集飞瞳CIMCAI领跑全球港口码头人工智能科技&#xff0c;领先集装箱箱况残损识别科技全方位提升港口码头效能。集装箱残损可能…

剑指 Offer 68 - I. 二叉树的最近公共祖先

摘要 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 剑指 Offer 68 - II. 二叉树的最近公共祖先 一、二叉搜索树的最近公共祖先 注意到题目中给出的是一棵二叉搜索树&#xff0c;因此我们可以快速地找出树中的某个节点以及从根节点到该节点的路径&#xff0c;例如我们需要找…

2023年金三银四必备软件测试常见面试题1500问!!!

十九、持续集成19.1 jenkins ant jmeter svn接口自动化测试?jenkins ant jmeter svn环境搭建原来这个环境是我这边搭建的&#xff0c;主要是几个步骤&#xff0c;第一Jenkins安装、第二&#xff0c;ant安装、第三&#xff0c;jmeter安装、第四&#xff0c;jmeter与ant连…

HTML基础(1)

HTML基础HTML基本介绍编辑工具HTML概述多如牛毛的标签头部标签&#xff1a;标题与段落标签&#xff1a;br换行符&#xff1a;a href超链接标签&#xff1a;< meta > 元素标签&#xff1a;主体标签HTML注释&#xff1a;水平线标签hr&#xff1a;段落标签p&#xff1a;文本…

[ 常用工具篇 ] 多媒体视频处理工具 ffmpeg 安装使用详解

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

【python学习笔记】:字符串编码转换

在 Python 中&#xff0c;有 2 种常用的字符串类型&#xff0c;分别为 str 和 bytes 类型&#xff0c;其中 str 用来表示 Unicode 字符&#xff0c;bytes 用来表示二进制数据。str 类型和 bytes 类型之间就需要使用 encode() 和 decode() 方法进行转换。 Python encode()方法 …

软件工程(4)--螺旋模型

前言 这是基于我所学习的软件工程课程总结的第四篇文章。 在软件开发过程中必须及时识别和分析风险&#xff0c;并且采取适当措施以消除或减少风险的危害。构建原型是一种能使某些类型的风险降至最低的方法。为了降低交付给用户的产品不能满足用户需要的风险&#xff0c;一种行…

LeetCode 725. 分隔链表

LeetCode 725. 分隔链表 难度&#xff1a;middle\color{orange}{middle}middle 题目描述 给你一个头结点为 headheadhead 的单链表和一个整数 kkk &#xff0c;请你设计一个算法将链表分隔为 kkk 个连续的部分。 每部分的长度应该尽可能的相等&#xff1a;任意两部分的长度差…

〖产品思维训练白宝书 - 核心竞争力篇⑯〗- 产品经理核心竞争力解读之如何学习的又快又好并学以致用

大家好&#xff0c;我是 哈士奇 &#xff0c;一位工作了十年的"技术混子"&#xff0c; 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区。 &#x1f4ac; 人生格言&#xff1a;优于别人,并不高贵,真正的高贵应该是优于过去的自己。&#x1f4ac; &#x1f4e…

前端算法codewhy第一章: 邂逅数据结构与算法

第一章: 邂逅数据结构与算法 编程的真相 – 数据的处理 数据结构与算法的本质 学习数据结构与算法到底有什么实际应用&#xff1f; 源码中的数据结构 如何学习数据结构与算法&#xff1f; TypeScript常见数据结构与算法 到底什么是数据结构 什么是数据结构&#xff08;Data Str…

数据库系统之并发控制(重点标记)

1. 并发控制概述 事务是并发控制的基本单位&#xff0c;并发控制机制的任务是&#xff1a; 对并发操作进行正确调度。保证事务的隔离性。保证数据库的一致性。 数据不一致及其原因 并发操作带来的数据不一致性主要包括丢失修改&#xff0c;不重复读和读“脏”数据。产生三类数…

Appium自动化测试 Inspector定位Webview/H5页面元素

目录操作步骤Python操作该混合App代码Appium在操作混合App或Android App的H5页面时, 常常需要定位H5页面中的元素, 传统方式是 FQ 使用Chrome://inspect来定位元素, 环境准备相当繁琐, 不仅需要想办法FQ, 而且还需要Android设备安装Google框架以及手机版Chrome浏览器以及相应的…

图片分类 STL-10 数据集下载及使用指南

转载自安全验证 - 知乎 这次给大家介绍的 STL10数据集&#xff0c;是图片分类任务早期常用的基准数据集之一&#xff0c;虽然只有10种样本&#xff0c;图片尺寸也偏小&#xff0c;但是标注类型比较平衡&#xff0c;各种种类都有各500张&#xff08;train&#xff09;/800张&am…

深度解析linux的文件系统

背景&#xff1a;虚拟文件系统&#xff08;有时也称作虚拟文件交换&#xff0c;更常见的是简称VFS)作为内核子系统&#xff0c;为用户空间程序提供了文件和文件系统相关的接口。系统中所有文件系统不但依赖VFS共存&#xff0c;而且也依靠VFS系统协同工作。通过虚拟文件系统&…

动态规划(一):01背包问题和完全背包问题

动态规划 目录动态规划1.01背包问题1.1题目介绍1.2思路一介绍(二维数组)1.3思路二介绍(一维数组) 空间优化1.4思路三介绍(输入数据优化)2.完全背包问题2.1题目描述&#xff1a;2.2思路一(朴素算法)2.3思路二(将k优化处理掉)2.4思路三(优化j的初始条件)总结1.01背包问题 1.1题目…

求职-进度

2-23 投递 恒生校招 C https://campus.hundsun.com/personal/deliveryRecord 投递 合合信息 大数据开发工程师 https://intsig.zhiye.com/personal/deliveryRecord 投递 尚游网络 游戏服务器开发工程师 https://app.mokahr.com/campus_apply/shangyou/36582?recommendCodeDS…

项目管理中,哪些信息差是不应该存在的呢?

在项目管理中&#xff0c;如果存在信息差&#xff0c;那么就会存在了巨大的问题&#xff0c;从而导致项目的失败。 项目管理中哪些信息差是不应该存在的呢&#xff1f; 1、项目背景 项目经理接手项目&#xff0c;首先要了解清楚项目背景&#xff0c;避免在项目过程中对自己…

计算句子向量相似度:SentenceBert和SimCSE

SentenceBert Sentence-BERT: 如何通过对比学习得到更好的句子向量表示 - 哔哩哔哩 (bilibili.com) (229条消息) Sentence-BERT详解_数学家是我理想的博客-CSDN博客_sentence-bert 动机&#xff1a; 直接把2个句子串联起来输入Bert做分类&#xff08;即Cross-Encoder方式&…

Blazor入门100天 : 身份验证和授权 (6) - 使用 FreeSql orm 管理ids数据

目录 建立默认带身份验证 Blazor 程序角色/组件/特性/过程逻辑DB 改 Sqlite将自定义字段添加到用户表脚手架拉取IDS文件,本地化资源freesql 生成实体类,freesql 管理ids数据表初始化 Roles,freesql 外键 > 导航属性完善 freesql 和 bb 特性 本节源码 https://github.com/…