【OC学习-10】写一个复数相加的例子来谈谈OC的self是什么意思?

OC的self相当于C++里面的this吧。一般都是隐形的,就是不写出来的。其实就是自己的意思,谁调用就说的是谁,那么super呢?就是父类,谁调用那么就是谁的父类。

建一个Complex的类。

(1)在Complex.h里

#import <Foundation/Foundation.h>
@interface Complex : NSObject
//只声明属性,没有写实例变量
@property(nonatomic) double real;
@property(nonatomic) double imag;
//初始化函数
-(id)initWithReal:(double)aReal Imag:(double)aImag;
//复数的加法函数
-(Complex *)add:(Complex *)aSecond;
@end

(2)在Complex.m里

#import "Complex.h"
@implementation Complex
//别忘记和@property配套的@synthesize
@synthesize real,imag;
//初始化函数
-(id)initWithReal:(double)aReal Imag:(double)aImag{
    if (self=[super init]) {
        self.real=aReal;
        self.imag=aImag;
    }
    return self;
}
//复数的加法函数,函数返回值是复数,只需要一个参数,还有一个参数实际上就是self自身
-(Complex *)add:(Complex *)aSecond{
//这里创建一个新的复数,而不是用+=操作,是因为+=会改变原先的数值,不是最好方法
    Complex * result=[[Complex alloc]init];
//这里的self就是谁调用就是谁,即某一个复数
    result.real=self.real+aSecond.real;
    result.imag=self.imag+aSecond.imag;
    return result;
}
@end

(3)在main.m里

#import <Foundation/Foundation.h>
#import "Complex.h"    //记得导入头文件
int main(int argc, const char * argv[])
{
    @autoreleasepool {
//实例化并初始化复数
        Complex * a=[[Complex alloc]initWithReal:1 Imag:3];
        Complex * b=[[Complex alloc]initWithReal:4 Imag:2];
//add是一个方法,所以用[a add]调用,并传递一个b参数
        Complex * c=[a add:b];
        NSLog(@"%g+%gi",c.real,c.imag);
    }
    return 0;
}

返回结果:

5+5i

由于新版的xcode里面ARC功能,大白话就是:程序员只管写alloc,而不需要写release和auturelease,因为它自动处理了,所以代码更简洁。当然,练习的时候可以把这个ARC功能关闭。

时间: 2024-10-11 03:43:22

【OC学习-10】写一个复数相加的例子来谈谈OC的self是什么意思?的相关文章

【Linux学习】 写一个简单的Makefile编译源码获取当前系统时间

打算学习一下Linux,这两天先看了一下gcc的简单用法以及makefile的写法,今天是周末,天气闷热超市,早晨突然发现住处的冰箱可以用了,于是先出去吃了点东西,然后去超市买了一坨冰棍,老冰棍居多,5毛钱一根,还有几根1.5的. 嗯 接着说gcc的事 先把源代码贴上来 //gettime.h #ifndef _GET_TIME_H_ #define _GET_TIME_H_ void PrintCurrentTime(); #endif //gettime.c #include <stdio.

JS入门学习,写一个时钟~

<!-- 耽搁了几天,于是又继续回到JS的学习了~~ 各种头大,加油吧... --> <!doctype html><html><head> <title>数码时钟</title> <meta charset="gb2312"> <style type="text/css"> *{ padding:0; margin:0;} body{background:rgb(0,2

JS入门学习,写一个简单的图片库

<!-- 新手刚开始学JS,每天坚持写点东西 坚持下去,希望能有所进步 .  加油~~ --> <!DOCTYPE html>                                            <html><head> <title>创建一个图片库</title> <meta charset="gb2312" /> <link rel="stylesheet"

C++面向对象的学习:写一个数组类

凰00盟3NDT73澄F概http://www.zcool.com.cn/collection/ZMTgxNzIzMjg=.html O00W51槐AQ毓攀7柿http://www.zcool.com.cn/collection/ZMTgxNzI0NTY=.html 鄙3C虾Q莱烙艺橙俗OEUhttp://www.zcool.com.cn/collection/ZMTgxNzI0OTY=.html ZL2OWM乖3舅ZP坝裙http://www.zcool.com.cn/collection/Z

Vue学习—Vue写一个图片轮播组件

1.先看效果: 熟悉的图片轮播,只要是个网站,百分之90以上会有个图片轮播.我认为使用图片轮播. 第一可以给人以一种美观的感受,而不会显得网站那么呆板, 第二可以增加显示内容,同样的区域可以显示更多内容. 2.每学一个新东西 ,图片轮播都是很好的练手案例,而且,也很实用. 3.基本要求:页面加载,自动播放.鼠标悬停,停止播放.鼠标离开,继续播放 点击左右箭头切换上一张,下一张图片. 下方小圆点显示当前位第几张图片. 4.使用Vue实现,想法: 5.示例代码 结构html: <template>

shell脚本学习-练习写一个脚本2

# 1.依次展示/var目录下的对象,并说明是文件或者目录.格式如:Hello,$file. # 2.统计一个有多少个文件. #!/bin/bash #Program Description: #Author: Created by ctu_lzq #Date: 2018/11/15 list=`ls /var |awk '{print $1}'` num=`ls /var |wc -l` for i in $list; do if [ -f "/var/$i" ];then echo

学习如何写一个vue插件【入门篇】

#### 疑答 1.市面上已经有那么多插件可用,为什么还要造轮子?学习.借鉴思想.应用到开发 2.能否在项目中使用?与网上插件使用相同   更新维护问题怎么解决? 自身动力,使用者反馈等 #### 准备工具 1.官方文档https://cn.vuejs.org/v2/guide/plugins.html2.github.npm网站账号.node/npm.git3.代码工具:vscode #### 过程1.新建文件夹 vue-loading-text npm init 初始化 2.代码工具:vsc

Servlet学习教程(三)---- 一个简单的Servlet例子

我们用个最简单的Servlet例子来解说一下Servlet简单配置以及Servlet类实现类的写法. 第一,我们新建一个Dynamic Web Project,起名Servlet 点击NEXT,设置Default output folder 为Servlet/WebContent/WEB-INF/classes 第二,创建一个包,包名为Servlet,然后创建一个类名为WelcomeServlet类.(Servlet类当然缺少不了Servlet容器,请注意你的开发软件是否已经集成Servlet容

linux设备驱动第三篇:写一个简单的字符设备驱动

在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存. 下面就开始学习如何写一个简单的字符设备驱动.首先我们来分解一下字符设备驱动都有那些结构或者方法组成,也就是说实现一个可以使用的字符设备驱动我们必须做些什么工作. 1.主设备号和次设备号 对于字符设备的访问是通过文件系统中的设备名称进行的.他们通常位于/dev目录下.如下: [plain] vie