首页 > 其他分享 >Objective C 属性

Objective C 属性

时间:2023-06-22 11:31:29浏览次数:64  
标签:数据类型 NSString bear synthesize Objective retain 属性 setter

为每一个变量实现其访问器,繁琐,@property 可以替我们减轻工作。

 

是否暴露读写接口

readonly

将只生成getter方法而不生成setter方法(getter方法没有get前缀)。

readwrite

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

 

 

线程安全

atomic

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


(atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所 以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。)

nonatomic

不保证setter/getter的原子性,多线程情况下数据可能会有问题。iPhone只能用nonatomic。

 

 

赋值(setter)的工作机制

 

assign

指定setter方法用简单的赋值,这是默认操作。你可以对基础数据类型(如int)使用这个属性。

你可以想象一个float,它不是一个对象,所以它不能retain、copy。

对基础数据类型 (例如NSInteger)和C数据类型(int, float, double, char, 等) 适用简单数据类型或对指针的弱引用

典型的适用数据类型:NSInterger,CGFloat和C数据类型(int,float,double,char等等)。

如果使用对象类型的参数,需要开启garbage collector
[现在的版本叫引用计数器 不同的版本不同的叫法  在mac编程和在iphone编程中的叫法也不同  谅解 谅解 ]

retain

指定retain应该在后面的对象上调用,前一个值发送一条release消息。

你可以想象一个NSString实例,它是一个对象,而且你可能想要retain它。

典型的数据类型:针对NSObject及其子类 如果启用了garbage collector 和assign 的作用一样 

  1. - (void)setName:(NSString *)newName { 
  2. if (name != newName) { 
  3.        [name release]; 
  4.        name = [newName retain]; 
  5.        // name’s retain count has been bumped up by 1
  6.     } 

copy

指定应该使用对象的副本(深度复制),前一个值发送一条release消息。

基本上像retain,但是没有增加引用计数,是分配一块新的内存来放置它。

典型的数据类型:NSString

 

比如一个NSString 对象,地址为0×1111 ,内容为@”STR”

Copy 到另外一个NSString 之后,地址为0×2222 ,内容相同,新的对象retain为1 ,旧有对象没有变化

retain 到另外一个NSString 之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1

retain 是指针拷贝,copy 是内容拷贝 

 

@synthesize

在 *.h 文件中,使用 @property 设置好属性的值后,在 *.m 文件中还要用 @synthesize 来定义实现的。

@synthesize xxx;  为前面定义的属性xxx自动生成读写函数;

@synthesize是objective-c 2.0的新特性,它的作用就是自动为你定义的成员变量生成get和set方法。
比如你定义了bear属性,
CCSprite *_bear;
你需要同时定义
@property (nonatomic, retain) CCSprite *bear;
和 @synthesize bear = _bear;
这样,编译器才能为你生成get和set方法。
本例中就会为你生成下列两个方法:

-(CCSprite*) getBear{
return _bear;
}
-(void) setBear:(CCSprite*)bear{
if(_bear != bear){
[_bear release];
_bear = [bear retain]; //这里会是retain 跟你在@property(nonatomic,retain)中申明了retain有关。
}
}

为什么会是bear = _bear呢?
这是固定用法。如果你的成员变量的名字也是bear,那么就不要这个等于号。直接可以写成 @synthesize bear;这也是你看到的比较多的写法。

http://www.haogongju.net/art/1307400

 

属性用的成员变量

如上面写的, 可以在 @synthesize 时指定用那个成员变量。

成员变量 在之前版本需要自己书写,最新版本可以编译器帮我们产生。

Objective C 属性_成员变量

http://www.2cto.com/kf/201202/120763.html

http://unmi.cc/objective-c-proerty-synthsiz

 

参看:

Objective-C中类属性的 copy, tetain, assign , readonly , readwrite, nonatomic区别
http://spring-studio.net/?p=219

nonatimic,retain,assign,copy,readonly,readwrite

http://southking.iteye.com/blog/1487793

标签:数据类型,NSString,bear,synthesize,Objective,retain,属性,setter
From: https://blog.51cto.com/u_15588078/6534496

相关文章

  • 复制对象中的一部分属性给另一个对象(对象部分属性解构到新对象)
    复制对象中的一部分属性给另一个对象(对象部分属性解构到新对象)点击查看代码constobj={a:1,b:2,c:3,};//第1种,全部赋值constnew_obj={}for(letkeyinobj){new_obj[key]=obj[key]}console.log(new_obj);{a:1,b:2,c:3}//第2种,正常取......
  • DataFrame针对某一列求和及计算均值等统计属性
    DataFrame针对某一列求和及计算均值等统计属性数据为了方便展示,取前5个数据作为案例data=test_data.iloc[0:5]对col1列求和data['col1'].sum()对col1列求均值data['col1'].mean()对col1列求方差data['col1'].var()对col1列求标准差data['col1'].std()......
  • 1688商品详情数据接口、商品列表接口,商品属性接口、商品优惠券接口
    业务背景:大家有探讨稳定1688平台商品详情数据包括:获取商品列表主图、价格、销量,标题,sku的等数据接口完整解决方案。这个引起了我技术挑战的兴趣。目前,自己做了压测,QPS高、出滑块概率极低,API整体稳定,可满足业务场景的性能需求。解决方案: 经讨论封装成item_get-根据ID取商品详情接口......
  • iOS开发笔记 - Objective-C和JavaScript的混编
    最近看了一个对Github上面编程语言使用统计的排行榜,JavaScript真可以说是一枝独秀,很难想象20年前,这个语言只是浏览器中的装饰性语言,能做的事情也就是一点特效或者检查一下要提交给服务器的表单是否满足要求。今天的JavaScript已经是一个全栈语言,从客户端到服务器无所不在。很多编程......
  • 全面解读Objective-C语言及Cocoa特性——《Objective-C基础教程》
    媒体评论“这是我读过的最好的一本编程书。我从头到尾逐字逐句地读完了它,可读性真强啊!试问,现在有几本技术书能达到这种程度?”——Amazon读者评论“这本书结构清晰,逻辑性强,风格幽默……借助本书,你可以毫不费力地从一个初学者摇身一变升级为优秀的Objective-C编程人员。”——Ama......
  • iPhone开发四剑客之《Objective-C基础教程》
     iPhone开发四剑客之《Objective-CObjective-C语言是C语言的一个扩展集,许多(可能是大多数)具备MacOSX外观的应用程序都是使用该语言开发的。它以C语言为基础,添加了一些微妙但意义重大的特性。苹果公司为Objective-C语言提供了Cocoa工具包。Cocoa是使用Objective-C......
  • 【python基础】类-类属性
    在初始类中,我们介绍了如何访问类属性,除了访问类属性外还有其他操作类属性的情况,我们将在这里做详细介绍:1.给类属性指定默认值类中的每个属性都必须有初始值,哪怕这个值是0或者空字符串。在有些情况下,如设置默认值时,在方法__init__方法内指定这种初始值是可行的,如果对某个属性这样......
  • Qt编写控件组态属性设计器源码属性设计器产品不包括里面控件的源码
    Qt编写控件组态属性设计器源码属性设计器产品不包括里面控件的源码1.自动加载插件文件中的所有控件生成列表,默认自带的控件超过120个。2.拖曳到画布自动生成对应的控件,所见即所得。3.右侧中文属性栏,改变对应的属性立即应用到对应选中控件,直观简洁,非常适合小白使用。4.独创属性......
  • Java类属性第二个字母大写问题,请求参数设置不上,返回参数小写
     其实这个问题几年前就遇到过,也解决了,但是最近又看到项目中有人这么用,就想起来了,写在这里,给自己也给大家提个醒。在Java中,如果类的某个属性第二个字母是大写,比如:nToken,这样的属性一定要自己手动生成getter和setter方法。如果使用lombok的@Data注解,它默认生成的getter和setter......
  • WinUI ComboBox加载时不能正常显示绑定属性
    搞WINUI时发现下述问题:ComboBox的item1绑定了一个属性,但是程序在加载完成后,页面上并不能正常显示(已经设置了默认选择为ComboBox绑定属性那个item,但是就不正常);而TextBlock绑定相同的属性,是能正常显示的。 具体现象如下,左红色框中为TextBlock,右蓝色框中为ComboBox。 其xam......