[IOS 开发]Objective - C 面向对象 - 方法 - 成员变量

发布时间:2017-09-02 15:39:26
[IOS 开发]Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制

Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本;

-- 基本类型 (值传递) : int 等基本类型直接传入 这些基本类型的的副本;

-- 指针类型 (地址传递) : 使用指针变量作为参数, 传递的也是指针变量的副本, 但是这个副本本身的值是一个地址, 地址 变量 和 地址 变量的副本 还是指向同一个地址;

(2) OC 方法 与 传统函数

方法 与 传统函数 :

-- 结构化编程语言 : 整个软件由一个函数构成, 如 C 语言, 一个 main 函数就是整个软件架构;

-- 面向对象语言 : 整个软件由 类 组成, 软件中的 方法 必须属于类, 不能独立存在;

(3) 类方法 与 实例方法

方法定义 : 方法只能定义在类中, 不能独立定义;

-- 类方法 : 使用 + 标识, 这个方法属于类方法, 使用 [类 方法] 调用;

-- 实例方法 : 使用 - 标识, 该方法属于实例方法, 使用 [对象 方法] 调用;

(4) 方法属性

方法属性 :

-- 不独立存在 : 不能独立定义, 只能在类中定义;

-- 类 对象 : 方法要么属于类, 要么属于对象;

-- 方法执行 : 方法不能独立执行, 需要使用 类 或 对象作为调用者;

2. 形参个数可变的方法

形参可变方法简介 :

-- 方法定义 : 最后一个形参后增加 逗号 和 三点 , ... ;

-- 示例 : NSLog() 函数可以传入任意多参数, 该函数就是形参个数可变的方法;

示例代码 :

-- 接口 :

/************************************************************************* > File Name: Varargs.h > Author: octopus > Mail: octopus_truth.163.com > Created Time: 日 9/27 22:04:34 2015 ************************************************************************/ #import @interface Varargs : NSObject /* * 形参个数可变方法 * 在 NSString * 类型参数后面加上 ,... 一个逗号 三个点号, * 表明该方法还可以接受 n 个 NSString * 类型的参数 */ -(void) varargs_test : (NSString *) str, ...; @end

-- 实现 :

/************************************************************************* > File Name: Varargs.m > Author: octopus > Mail: octopus_truth.163.com > Created Time: 日 9/27 22:24:55 2015 ************************************************************************/ #import Varargs.h @implementation Varargs -(void) varargs_test : (NSString *) str, ... { /* * va_list 类型 : 用于指向可变参数列表的指针变量 */ va_list argList; // str 如果为 null 的话, 地址就会为0 if(str) { NSLog(@%@, str); /* * 开始处理可变形参的列表, * 并让指针变量指向可变形参列表的第一个参数 * 开始提取可变参数列表的参数 */ va_start(argList, str); /* * va_arg : 提取指针当前指向的参数, * 并将指针移动到下一个参数 */ NSString * arg = va_arg(argList, id); //如果指针指向的参数 不为 nil , 则进入循环体 while(arg) { NSLog(@%@, arg); arg = va_arg(argList, id); } /* * var_end : 结束处理可变形参, 释放指针变量 */ va_end(argList); } } @end

-- main 函数 :

/************************************************************************* > File Name: VarargsTest.m > Author: octopus > Mail: octopus_truth.163.com > Created Time: 日 9/27 22:33:09 2015 ************************************************************************/ #import Varargs.h int main(int argc, char * argv[]) { @autoreleasepool { Varargs * va = [[Varargs alloc]init]; [va varargs_test : @参数一, @参数二, @参数三, @参数四, nil]; } }
-- 执行过程 : 执行 clang -fobjc-arc -framework Foundation Varargs.m VarargsTest.m 命令; octopus-2:oc_object octopus$ clang -fobjc-arc -framework Foundation Varargs.m VarargsTest.m octopus-2:oc_object octopus$ ./a.out 2015-09-30 08:58:55.177 a.out[2823:507] 参数一 2015-09-30 08:58:55.180 a.out[2823:507] 参数二 2015-09-30 08:58:55.180 a.out[2823:507] 参数三 2015-09-30 08:58:55.181 a.out[2823:507] 参数四 octopus-2:oc_object octopus$

二. Object-C 成员变量
1. 成员变量机制 (1) 变量分类

变量分类 : 成员变量, 局部变量, 全局变量;

-- 局部变量 : 在函数里面定义的变量;

-- 全局变量 : 在函数外定义的变量;

-- 成员变量 : 在下面讲解;

(2) 成员变量简介

成员变量 : 在类 接口 或 实现 部分定义的变量, 都是实例变量, 不支持真正的类变量;

-- 实例变量 : 类对象被创建开始存在, 系统销毁对象, 实例变量就会随之销毁;

-- 实例变量访问 : 实例->实例变量;

(3) 成员变量 源码示例

示例源码 :

/************************************************************************* > File Name: OCPerson.m > Author: octopus > Mail: octopus_truth.163.com > Created Time: 三 9/30 09:10:09 2015 ************************************************************************/ #import @interface OCPerson : NSObject { //定义实例变量 @public NSString * _name; int _age; } @end @implementation OCPerson @end int main(int argc, char * argv[]) { @autoreleasepool { //创建成员变量 OCPerson *p =[[OCPerson alloc] init]; //通过指针变量访问两个实例变量 NSLog(@p->_name : %@ , p->_age : %d, p->_name, p->_age); //通过指针访问变量为两个成员变量赋值 p->_name = @Jim; p->_age = 18; NSLog(@p->_name : %@ , p->_age : %d, p->_name, p->_age); OCPerson *p1 = [[OCPerson alloc] init]; OCPerson *p2 = [[OCPerson alloc] init]; p1->_name = @Tom; p2->_name = @Keen; NSLog(@p1->_name : %@ , p2->_name : %@, p1->_name, p2->_name); } }
-- 执行结果 : octopus-2:oc_object octopus$ clang -fobjc-arc -framework Foundation OCPerson.m octopus-2:oc_object octopus$ ./a.out 2015-09-30 09:17:38.510 a.out[2858:507] p->_name : (null) , p->_age : 0 2015-09-30 09:17:38.513 a.out[2858:507] p->_name : Jim , p->_age : 18 2015-09-30 09:17:38.513 a.out[2858:507] p1->_name : Tom , p2->_name : Keen octopus-2:oc_object octopus$

(4) 成员变量 源码示例解析

示例解析 :

-- 成员变量初始化 : 创建对象时系统会为为成员变量赋初始值, 基础类型 0, 指针类型 nil;

-- 初始化过程 : 执行 OCPerson *p1 = [[OCPerson alloc] init] 语句时 系统为 OCPerson 对象的成员变量分配内存空间, 并初始化, 并将对象赋给 p1 变量;

2. 模拟类变量

前提 : Object-C 不支持 类变量, 但是可以使用 全局变量来模拟类变量;

static 关键字 : 不能修饰成员变量, 只能修饰 局部变量 和 全局变量;

-- 修饰局部变量 : 将局部变量存储到静态存储区;

-- 修饰全局变量 : 限制全局变量只能在当前文件中访问;

-- 修饰函数 : 限制该函数只能在当前源文件中访问;

模拟类变量方式 : static 修饰全局变量, 提供一个类方法暴露该全局变量, 并提供一个类方法暴露该全局变量;

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉网站建设公司 http://https://www.jingchucn.com/zt/wuhan_wangzhanjianshe/


独家出品

新闻由机器选取每5分钟自动更新

新闻搜索源于互联网新闻网站和频道,系自动分类排列,本站不刊登或转载任何完整的新闻内容