object-c 1
多个参数的写法
(方法的数据类型)函数名:(参数1数据类型)参数1的数值的名字 参数2的名字: (参数2数据类型) 参数2值的名字 …. ;
举个例子,一个方法的定义:
-(void) setKids: (NSString *)myOldestKidName secondKid: (NSString *) mySecondOldestKidName thirdKid: (NSString *) myThirdOldestKidName;
实现这个函数的时候:
-(void) setKids: (NSString *)myOldestKidName secondKid: (NSString *) mySecondOldestKidName thirdKid: (NSString *) myThirdOldestKidName
{
大儿子 = myOldestKidName; 二儿子 = mySecondOldestKidName; 三儿子 = myThirdOldestKidName;
}
调用的时候:
Kids *myKids = [[Kids alloc] init];
[myKids setKids: @”张大力” secondKid: @”张二力” thirdKid: @”张小力”];
一上内容为引用 ,引用地址tp://blog.163.com/long_wtf/blog/static/185553270201111910536/
刚开始接触Objective-C的时候,会感觉这种函数声明和调用都有点怪,实际是受C和C++传统函数声明方式的影响,看会C++的函数声明
void setKids(string *myOldestKidName , string *mySecondOldestKidName , string *myThirdOldestKidName);
调用的时候:
myKids.setKids("张大力","张二力","张小力");
在C++里,以我们的观点这个函数的”函数名“是setKids,然后()内是参数类型和形参变量
C++中有overload(重载)的概念,我们可以声明void setKid(int myOldestKidAge , string *mySecondOldestKidName , string *myThirdOldestKidName);
编译器是如何识别这两函数呢,实际是对于编译器会将所有参数的类型加到函数名上,变成setKid_string_string_string 和setKid_int_string_string (这里忽略了this等隐藏参数)
对于编译器我们的两个setKid原本就是不同的,重载只是对于我们而言。
对于Objective-C中,许多人认为“Objective-C中参数表是这样的, 参数名:(数据类型)形参名。第一个参数的参数名就是函数名”,其实这种理解不太正确,对于Objetive-C的函数名应该是由所有参数名的组合的,如上例中函数名是setKid:secondKid:thirdKid: 有使用过@selector的同学,会知道我们使用@selector获得带三个参数的函数的sel类型(可以当函数标识符理解)需要这样用@selector(setKid:secondKid:thirdKid)。
所以我的理解时函数名是setKid:secondKid:thirdKid: ,而setKid实际是第一个参数的参数名。
这有一个问题是Objecitve-C为什么不像C++一样,直接使用形参的数据类型放到函数名里,而非要让我们给每一个形参定义一个参数名呢。这是因为重载的方法只在类的内部,在C++中如果让同一函数在子类父类的不同对象中执行相同函数名有不同的实现,重载是办不到的,我们需要加vitrual关键字,把它声明成虚函数,这就是多态。在Objetive-C中所有的函数均是具有多态特性的,都可在运行时动态执行调用,我们需要一种方式对于所有的同名函数,在不同的对象可以动态执行,这时候Objetive-C便选择了中缀表达方式。
object-c 1的更多相关文章
- CoreCLR源码探索(一) Object是什么
.Net程序员们每天都在和Object在打交道 如果你问一个.Net程序员什么是Object,他可能会信誓旦旦的告诉你"Object还不简单吗,就是所有类型的基类" 这个答案是对的 ...
- JavaScript Object对象
目录 1. 介绍:阐述 Object 对象. 2. 构造函数:介绍 Object 对象的构造函数. 3. 实例属性:介绍 Object 对象的实例属性:prototype.constructor等等. ...
- javascript之Object.defineProperty的奥妙
直切主题 今天遇到一个这样的功能: 写一个函数,该函数传递两个参数,第一个参数为返回对象的总数据量,第二个参数为初始化对象的数据.如: var o = obj (4, {name: 'xu', age ...
- c# 基础 object ,new操作符,类型转换
参考页面: http://www.yuanjiaocheng.net/webapi/config-webapi.html http://www.yuanjiaocheng.net/webapi/web ...
- APEX:对object中数据进行简单处理?
在Salesforce中,常常要对各种数据进行处理,已满足业务逻辑.本篇文章会介绍如何实现从object获取数据,然后将取得的数据进行一系列简单处理. 第一步:SongName__c 是一个新建的ob ...
- 笔记:Memory Notification: Library Cache Object loaded into SGA
笔记:Memory Notification: Library Cache Object loaded into SGA在警告日志中发现一些这样的警告信息:Mon Nov 21 14:24:22 20 ...
- Selenium的PO模式(Page Object Model)[python版]
Page Object Model 简称POM 普通的测试用例代码: .... #测试用例 def test_login_mail(self): driver = self.driver driv ...
- Object是什么
Object是什么 .Net程序员们每天都在和Object在打交道如果你问一个.Net程序员什么是Object,他可能会信誓旦旦的告诉你"Object还不简单吗,就是所有类型的基类" ...
- a different object with the same identifier value was already associated with the session:
hibernate操作: 实例化两个model类,更新时会提示 a different object with the same identifier value was already assoc ...
- CSharpGL - Object Oriented OpenGL in C#
Object Oriented OpenGL in C#
随机推荐
- iOS开发——数据持久化Swift篇&iCloud云存储
iCloud云存储 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super. ...
- javascript 递归之阶乘
阶乘,即5! = 5*4*3*2*1, 先看传统的做法,利用while循环实现: function factorial(num){ var result = num; if(num<0){ re ...
- Java ServletContext 详解
ServletContext, 是一个全局的储存信息的 空间,服务器开始,其就存在,服务器关闭,其才释放.request,一个用户可有多个:session,一个用户一个:而 servletContex ...
- mysqldump原理5
http://blog.csdn.net/niu870781892/article/details/6186078 导出多张表的时候表之间用空格分开: # mysqldump -h192.168.25 ...
- 阿里封神谈hadoop学习之路
阿里封神谈hadoop学习之路 封神 2016-04-14 16:03:51 浏览3283 评论3 发表于: 阿里云E-MapReduce >> 开源大数据周刊 hadoop 学生 s ...
- [原创]javascript prototype 对象 函数 <精简的美丽......>
精简的美丽...... javascript prototype 对象 函数 在javascript中我们都知道创建一个对象使用如下代码var x = {}对象可以拥有属性和方法var x = { ...
- [JavaScript]转--如何让JS代码高大上
原文出处:http://www.cnblogs.com/wenber/p/3630373.html 1,创造简短的写法 你可以这么写: 1 var slice = Array.prototype.sl ...
- iOS 中的 block 是如何持有对象的
Block 是 Objective-C 中笔者最喜欢的特性,它为 Objective-C 这门语言提供了强大的函数式编程能力,而最近苹果推出的很多新的 API 都已经开始原生的支持 block 语法, ...
- 【转】Git代码提交最佳实践
GIT Commit Good Practice The following document is based on experience doing code development, bug ...
- Linux下解决permission denied问题
由于权限问题,在linux下启动tomcat出现权限permission denied 提示解决方法如下: 1.cd 进入tomcat/bin目录 2.运行下面命令 sudo chmod 777 st ...