OC——Foundation—常用的类(5)——NSObject和反射、copy语法

反射:

OC反射机制是指:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,这种动态获取信息以及动态调用对象的方法的功能成为OC的反射机制。

Class反射

通过类名的字符串形式实例化对象

将类名变成字符串

SEL的反射

通过方法的字符串形式实例化方法

将方法变成字符串

//类名的反射
NSString *str=@“Person”;
Class class=NSClassFromString(str);
Person *person=[[class alloc]init];

//类转换为字符串
NSString *name=NSStringFromClass([Person clas]);

//方法的反射
NSString *method=@“test”;
SEL selector=NSSelectorFromString(method);
[person performSelector:selector];

//将方法转换为字符串
NSString *selectorname=NSStringFromSelector(selector);

copy和mutableCopy(copy语法的目的是:改变副本不影响源对象)

  • 一个对象使用copy或mutableCopy方法可以创建对象的副本
  • copy-需要先实现NSCopying协议,创建的是不可变的副本(如NSString、NSArray、NSDictionary)
  • mutableCopy-需要先实现NSMutableCopying协议,创建的时可变的副本(如NSMutableString、NSMutableArray、NSMutableDictionary)
  • 深复制:内容拷贝,源对象和副本指向的是不同的两个对象。源对象引用计数器不变,副本计数器设置为1(本质是看是否产生新的对象
  • 浅复制:指针拷贝,源对象和副本指向的是同一个对象。对象的引用计数器+1,其实相当于做了一次retain操作(本质是看产生的对象是否与源对象相同
  • 只有不可变的对象创建不可变副本才是浅复制

调用copy或mutableCopy方法产生的副本与源对象无关,只于对象调用的方法有关

copy语法示例:

NSString *str1=[[NSString alloc]initWithFormat:@“age is 10”];
NSString *str2=[str1 copy];
//copy出来的还是原来的对象,没有产生新的对象

MutableCopy示例:

NSString *str=[[NSString alloc]initWithFormat:@“age is 10”];
NSMutableString *str1=[str MutableCopy];
//产生了新的对象,因此是深度复制

copy语法注意事项:

如果想自定义copy,那么就必须遵守NSCopying,并且实现copyWithZone:方法

如果想自定义mutableCopy,那么就必须遵守NSMutableCopying,并且实现mutableCopyWithZone:方法

以copy为例,建议用[self class]代替直接类名

时间: 2024-10-05 19:42:32

OC——Foundation—常用的类(5)——NSObject和反射、copy语法的相关文章

OC——Foundation—常用的类(3)----NSDictionary

NSDictionary 通过唯一的key找到对应的value,相当于java中的map 常见的创建NSDictionary的方法 //第一种创建方法,字典是不可变的,初始化之后不可添加删除元素 NSDictionary *dict=[NSDictionary dictionaryWithObject:@“v1”forKey:@“k1”]; //第二种创建方法,最常用 NSDictionary *dict=[NSDictionary dictionaryWithObjectsAndKeys: @

OC——Foundation—常用的类(2)----NSArray

NSArray 用来存储对象的有序列表,它是不可变的 不能存储c语言中的基本数据类型,如int.float.enum.struct,也不能存储nil NSArray *array=[NSArray arrayWithObject:@“12345”]; 数组创建之后是不可变的,需要在创建的时候就初始化. 当把一个对象塞进数组时,这个对象的计数器会加1.   NSArray遍历 普通遍历 NSUInteger count = [array count]; for (int i=0;i<count;i

OC学习篇之---类的初始化方法和点语法的使用

一.首先来看一下类的初始化方法 在Java中我们知道一个每个类都有构造方法,这里的初始化方法就是和构造方法一个概念的,但是这里有一个区别是:Java中有默认构造方法,当我们去自定义构造方法的时候,这个默认构造方法就会被替换了,但是OC中是不会的,这点需要注意. 下面来看一下如何自定义初始化方法: Person.h [objc] view plain copy // //  Person.h //  03_InitDemo // //  Created by jiangwei on 14-10-1

(转载)OC学习篇之---类的初始化方法和点语法的使用

昨天介绍了OC中类的定义和使用,今天我们来继续学习类的初始化方法和点语法的使用. 一.首先来看一下类的初始化方法 在Java中我们知道一个每个类都有构造方法,这里的初始化方法就是和构造方法一个概念的,但是这里有一个区别是:Java中有默认构造方法,当我们去自定义构造方法的时候,这个默认构造方法就会被替换了,但是OC中是不会的,这点需要注意. 下面来看一下如何自定义初始化方法: Person.h 1 // 2 // Person.h 3 // 03_InitDemo 4 // 5 // Creat

黑马程序员--Foundation框架之--类其他常用的类:NSNumber,NSDate

------IOS培训期待与您交流! ------- Foundation的其他常用的类:NSNumber,NSDate 一.NSNumber 这个类主要是用来封装基本类型的,OC 中的集合是不允许存入基本类型的,所以NSNumber类就诞生了,需要将基本类型封装一下,然后存进去. 从这一点上我们就可以看出NSNumber是很重要的,后面一定会经常用到. 1.封包和解包 // 创建NSNumber // 封包 NSNumber *intNumber = [NSNumber numberWithI

OC学习篇之---类的定义

之前已经介绍了OC中的一个程序HelloWorld:http://blog.csdn.net/jiangwei0910410003/article/details/41578003,今天我们继续学习OC中类的相关知识. OC和C的最大区别就是具有了面向对象的功能,那么说到面向对象,就不得不说类这个概念了,如果学过Java的话,那么对类和对象的概念就不陌生了,因为Java是非常纯正的面向对象设计语言.关于类和对象的概念,这里就不仔细介绍了,网上有各种解释.我们之间来开一下OC中如何定义一个类,如何

OC Foundation框架—字符串

一.Foundation框架中一些常用的类 字符串型: NSString:不可变字符串 NSMutableString:可变字符串 集合型: 1) NSArray:OC不可变数组 NSMutableArray:可变数组 2) NSSet: NSMutableSet: 3) NSDictiorary NSMutableDictiorary 其它: NSDate NSObject 二.NSString和NSMutableString的使用与注意 (一)6种创建字符串的形式 (二)使用注意 (1)字符

(转载)OC学习篇之---类的定义

之前已经介绍了OC中的一个程序HelloWorld,今天我们继续学习OC中类的相关知识. OC和C的最大区别就是具有了面向对象的功能,那么说到面向对象,就不得不说类这个概念了,如果学过Java的话,那么对类和对象的概念就不陌生了,因为Java是非常纯正的面向对象设计语言.关于类和对象的概念,这里就不仔细介绍了,网上有各种解释.我们之间来开一下OC中如何定义一个类,如何实例化出一个对象等. 首先我们新建一个工程,系统会自动创建main.m文件的,这时候,我们右键项目,选择New File.. 然后

OC Foundation & NSString 字符串

一 Foundation 简介 Foundation 框架是苹果公司提供给开发人员,提高效率的的工作库. Foundation中提供了了多类,定义在头文件中.例如NSString类: #import <Foundation/NSSortDescriptor.h> #import <Foundation/NSStream.h> #import <Foundation/NSString.h> #import <Foundation/NSTextCheckingResu