iOS 给分类添加属性关联对象

iOS 给分类添加属性关联对象,第1张

分类里添加属性,仅仅是生成了set和get方法的声明,并没有实现,需要我们自己写set和get的方法。

几种set,get方法实现案例

1.可以全局字典实现属性的存取

//声明全局的字典

NSMutableDictionary *_names_

//load方法实现字典

+ (void)load

{

   _ names_ = [NSMutableDictionary dictionary]

}

//实现set方法

-(void)setName:(NSstring *)name

{

   NSString *key = [NSString stringWithFormat:@"%p", self]

    names_[MJKey] = name

}

//实现get方法

- (NSString *)name

{

//    NSString *key = [NSString stringWithFormat:@"%p", self]

    return names_[MJKey]

}

存在的问题:

全局变量无法释放 

如果每个类在不不同的线程,同时访问set和get,如果不不加锁,可能会出现问题

2.关联对象

- (void)setName:(NSString *)name

{

    objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_COPY_NONATOMIC)

}

- (NSString *)name

{

    // 隐式参数

    // _cmd == @selector(name)

    return objc_getAssociatedObject(self, _cmd)

}

第四个参数为关联策略,和变量的对应关系

第二个参数key

第一种方法利用字符串作为key,其中利用@"string",这样写的字符串是放在常量区的,无论哪里用到都是同一内存同一地址,但是这样写容易写错,且编译器没有提醒

更推荐第二种写法,不容易记错其中@selector(name),_cmd_,是函数的隐式参数

实现关联对象技术的核心对象

AssociationsManager

AssociationsHashMap

ObjectAssociationMap

ObjectAssociation

其中AssociationsManager类管理了一个全局的散列表,key是添加管理属性的对象,value是ObjectAssociationMap的散列表,其中key是第二个参数,value是ObjectAssociation类,ObjectAssociation其中包含有value和policy,也就是我们传入的第三和第四个参数

关联对象并不是存储在被关联对象本身的内存中

关联对象存储在全局的同一的AssociationsManager中

设置关联对象为nil,相当于移出关联对象

ios获取字典里的内容并不区分它到底是什么类型(数组、字符、字典等等),它就是一个容器。往里面保存东西的时候,用setValue:forKey:或者setObject:forKey:。就是给你所要保存的对象(value),起一个名字(key),然后set进入到字典里。

iOS是由苹果公司开发的移动 *** 作系统[1]  。苹果公司最早于2007年1月9日的Macworld大会上公布这个系统,最初是设计给iPhone使用的,后来陆续套用到iPod touch、iPad以及Apple TV等产品上。iOS与苹果的Mac OS X *** 作系统一样,属于类Unix的商业 *** 作系统。原本这个系统名为iPhone OS,因为iPad,iPhone,iPod touch都使用iPhone OS,所以2010WWDC大会上宣布改名为iOS(iOS为美国Cisco公司网络设备 *** 作系统注册商标,苹果改名已获得Cisco公司授权)。

iOS 设备可在世界各地通用。30 多种语言供你挑选,你还可以在各种语言之间轻松切换。由于 iOS 键盘基于软件而设计,因而有 50 多种支持特定语言功能的不同版式供你选择,其中包括字符的变音符和日文关联字符选项。此外,内置词典支持 50 多种语言,VoiceOver 可阅读超过 35 种语言的屏幕内容,语音控制功能可读懂 20 多种语言。

2007年10月17日,史蒂夫·乔布斯在一封张贴于苹果公司网页上的公开信上宣布软件开发工具包。它将在2008年2月提供给第三方开发商。软件开发工具包于2008年3月6日发布,并允许开发人员开发iPhone和iPod touch的应用程序,并对其进行测试,名为“ iPhone手机模拟器” 。然而,只有在付出了iPhone手机开发计划的费用后,应用程序才能发布。自从Xcode3.1 发布以后,Xcode就成为了iPhone软件开发工具包的开发环境。第一个Beta版本是iPhone SDK 1.2b1(build 5A147p)它在发布后立即就能够使用了。

SDK本身是可以免费下载的,但为了发布软件, 开发人员必须加入iPhone开发者计划, 其中有一步需要付款以获得苹果的批准。加入了之后,开发人员们将会得到一个牌照,他们可以用这个牌照将他们编写的软件发布到苹果的App Store。发布软件一共有三种方法: 通过App Store,通过企业配置仅在企业内部员工间应用,也可通过基于"Ad-hoc"而上载至多达100部iPhones。

多种保存方式。

用户偏好保存:NSUserDefaults

保存:[[NSUserDefaults standardUserDefaults] setObject:你的字典或数组 forKey:@"设置关键key"]

取出(根据你设置的key来取出): [[NSUserDefaults standardUserDefaults] objectForKey:@"设置关键key"]

2.保存到沙盒路径(数组同理)

NSDictionary *dic = @{}

//得到本地沙盒路径

NSString *libPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]

//拼接文件路径

NSString *path = [libPath stringByAppendingPathComponent:@"你的文件名.格式"]//一般常用plist

//保存

[dic writeToFile:path atomically:YES]

3.corodata或sqlite3

4.转换成字节流保存。

5.归档。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/bake/11889014.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存