【IOS开发基础系列】OC基础数据类型使用专题

1 常用数据类型

1.1 @property参数

@property参数分4类

1、读写属性:(readwrite/readonly)

2、setter语意:(assign/retain/copy)

3、原子性:(atomic/nonatomic)

4、引用强弱:(strong/week)


1.1.1 readwrite

     默认属性,将生成不带额外参数的getter和setter方法(setter方法只有一个参数)。


1.1.2 readonly

    只生成get方法


1.1.3 retain

    释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1。

    例如:

    @class Dog

    @property(nonatomic,retain)Dog*dog;


    注:nonatomic与atomic相对应,涉及线程,比较麻烦,这里不做赘述,读者仅需记住,nonatomic相对于atomic来说性能高,而声明属性时一般默认为atomic,故需在此申明nonatomic

    这里使用了retain,那么在set方法中,究竟如何体现的呢?

- (void)setDog:(Dog *)dog

{

   if(_dog !=dog){          //判断是否需要重新赋值

      [_dogrelease];        //释放旧引用,计数器-1

      _dog = [dogretain];   //重新赋值,计数器+1

   }

}


1.1.4 assign

    指定setter方法用简单的赋值,不更改索引计数(Reference Counting),这是默认操作。你可以对标量类型(如int)使用这个属性。你可以想象一个float,它不是一个对象,所以它不能retain、copy。


    例如:

   @property(nonatomic,assign)intcount;

    这里使用了assign,那么在set方法中,究竟如何体现的呢?

- (void)setCount:(int)count

{

   _count = count;

}


1.1.5 copy

    指定应该使用对象的副本(深度复制),前一个值发送一条release消息。基本上像retain,但是没有增加引用计数,是分配一块新的内存来放置它。copy是创建一个新对象,retain是创建一个指针,引用对象计数加1。copy: 建立一个索引计数为1的对象,然后释放旧对象,copy是创建一个新对象,retain是创建一个指针,引用对象计数加1。

例如:

        @property(nonatomic,copy)NSString* str;


这里使用了copy,那么在set方法中,究竟如何体现的呢?

- (void)setStr:(NSString *)str

{

 if(_str != str){          //判断是否需要重新赋值

      [_strrelease];        //释放旧引用,计数器-1

      _str = [strcopy];   //重新赋值,使用copy

   }

}


总结:

     1.retain:先release旧值,再retain新值,在上例中_dog与dog最终指向同一块内存区域。

     2.assign:直接赋值,不考虑内存管理。

     3.copy:Copy其实是建立了一个相同的对象,而retain不是;比如一个NSString对象,地址为0×1111,内容为@”STR”;Copy到另外一个NSString之后,地址为0x2222,内容相同,新的对象retain为1, 旧有对象没有变化。

     4.从retainassign copy的特点中我们可以看出:

     retain一般适用于OC中的对象

     assign一般适用于非OC对象,如int等普通类型

     copycopy一个对象变成新的对象(新内存地址) ,引用计数为1,原来对象计数不变,copy一个对象变成新的对象(新内存地址),引用计数为1,原来对象计数不变。


1.1.6 atomic

    对于对象的默认属性,就是setter/getter生成的方法是一个原子操作。如果有多个线程同时调用setter的话,不会出现某一个线程执行setter全部语句之前,另一个线程开始执行setter的情况,相关于方法头尾加了锁一样。默认值,保持数据的原子性访问,类似锁。


1.1.7 nonatomic

    不保证setter/getter的原子性,多线程情况下数据可能会有问题。nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。先释放原先变量,再将新变量retain然后赋值;非原子性访问,没加锁,但是提高访问速度,非多线程时访问数据时建议使用。

      注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。


1.1.8 strong

    强引用,ARC模式下与retain同作用,对象的retaincount自动加1


1.1.9 week

    弱引用,ARC模式下与assign同作用,非对象类型使用。


1.2 enum枚举类型

iOS:枚举类型enum,NS_ENUM,NS_OPTIONS

http://blog.csdn.net/annkie/article/details/9877643


2 Catalog使用

2.1 注意问题

2.1.1 Catalog不应履行继承职责,即尽量不要重写源类继承自基类的方法

    Catalog中如果重写基类方法的话,即使其他地方没有引用该类,系统照样会执行进入Catalog类方法中,代码超过了include类的执行范围,容易造成不可预知的异常。

例如:

#import "UIScrollView+UITouch.h"

@implementationUIScrollView (UITouch)


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event {

    [[self nextResponder] touchesBegan:touches withEvent:event];

    [super touchesBegan:touches withEvent:event];

}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent*)event {

    [[self nextResponder] touchesMoved:touches withEvent:event];

    [super touchesMoved:touches withEvent:event];

}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent*)event {

    [[self nextResponder] touchesEnded:touches withEvent:event];

    [super touchesEnded:touches withEvent:event];

}

@end

        虽然其他类中没有引用UIScrollView+UITouch.h这个分类类,在触发touch操作时,代码依然会执行到这三个方法中来,因为这个catalog相当于替源类UIScrollView实现了继承的职责,实现了父类的touch方法。自然,就会执行到这个分类类中来,即使没有显式include这个catalog类。


3 参考链接

IOS开发@property中assign、copy、retain等关键字的理解

http://blog.csdn.net/cx_wzp/article/details/47416831

IOS内存管理retain,assign,copy,strong,weak

http://blog.csdn.net/hengshujiyi/article/details/25627131

(Good)Objective-C属性特性(assign , retain , copy , readonly, readwrite , atomic , nonatomic)

http://davychen.blog.51cto.com/3283671/652717

Objective-C的@property详解(ios,iphone,xcode,retain,release,assign,copy)

http://blog.csdn.net/bingxuewujian/article/details/7739358

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 1.项目经验 2.基础问题 3.指南认识 4.解决思路 ios开发三大块: 1.Oc基础 2.CocoaTouch...
    阳光的大男孩儿阅读 4,967评论 0 13
  • 1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现cl...
    以德扶人阅读 2,323评论 2 50
  • 2017年整理的116道IOS开发面试题 时间:2017-05-08 发布:iOS培训 来源:IOS职场 分享到:...
    有理想有暴富的小青年阅读 844评论 0 10
  • 1.设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类...
    司马DE晴空阅读 1,275评论 0 7
  • OC的理解与特性OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装、继承、多态。它既具有静态语言的特性(...
    LIANMING_LI阅读 511评论 0 0