Object-cproperty的使用方法.docx_第1页
Object-cproperty的使用方法.docx_第2页
Object-cproperty的使用方法.docx_第3页
Object-cproperty的使用方法.docx_第4页
Object-cproperty的使用方法.docx_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

property(nonatomic,retain) NSString *aString;property:属性的定义,相当于C语言的setter和getter方法。assign:简单的赋值,不更改索引的计数。copy:建议一个索引计数为1的对象,然后释放旧对象;retain:释放旧对象,将旧对象的值赋予新对象,再增加新对象的索引计数1。针对具体的数据类型在属性定义应该这样选择:使用assign:对基础的数据类型,比如NSInterger,CGFloat和C数据类型(int,float,double,char等等)。使用copy:针对NSString;使用retain:针对NSObject及其子类。使用nonatomic:单线程,防止在写未完成的时候被另外一个线程读取,造成数据读取出错。使用release:基于一般的初始化,使用alloc和init关键词初始化的,要在恰当的地方release掉,全局变量在dealloc方法里面release,常规变量在不需要的时候就要释放掉。简介: property组合了新的预编译指令和新的属性访问器语法。1、property 表示声明了对象的一个属性。例如: property float smsHandling; 表示某个类的对象具有了一个float类型的名为smsHandling的属性。property自动生成了 -setsmsHandling 和 -getsmsHandling两个方法来操作属性.2、synthesize 表示创建该属性的访问器(Ps:-setsmsHandling 和 -getsmsHandling两个方法是在这句存在的情况下才开始由编译器输出的).3、property支持点访问,比如:(假设拥有上面属性的类为A)A.smsHandling = 0.3 ;4、property的扩展功能:(以上介绍的是property的基本用法) 我们还可以生命具有其他属性的property,用来表达我们希望特性具有某种行为的确切意愿。 property (copy) NSString * name;/通过想name这个属性添加copy的方法,使编译器和类的使用者知道name对象将被复制。 关于属性的括号内的扩展支持如下: 1,getter=getterName,setter=setterName,设置setter与getter的方法名 2,readwrite,readonly,设置可供访问级 2,assign,setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题 3,retain,setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序(CC上有相关资料) 4,copy,setter方法进行Copy操作, 与retain处理流程一样, 先旧值release,再Copy出新的对象,retainCount为1.这是为了减少对上下文的依赖而引入的机制. 5,nonatomic,非原子性访问, 不加同步, 多线程并发访问会提高性能. 注意, 如果不加此属性, 则默认是两个访问方法都为原子型事务访问. 锁被加到所属对象 以上的使用方式: 使用assign: 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等) 使用copy: 对NSString 使用retain: 对其他NSObject和其子类 注:retain的实际语法为:- (void)setName:(NSString *)newName if (name != newName) name release; name = newName retain; / names retain count has been bumped up by 1 什么是property?是一种代码生成机制,能够生成不同类型的gettersetter函数,特别是如果你想要用点(.)操作符号来存取变量的话,你就能必须使用property。如何使用?用法是固定的,注意下property后面小括号了跟的参数列表,nonatomic代表非原子性,既不支持多线程的同步,mac上可以根据具体情况考虑,IPhone上就加上把,retain代表对setter的对象加上一个retain操作,同时也会release原有的object,copy顾名思义就是copy setter中参数的对象。看下面的例子:代码interface Engine : NSObjectendimplementation Engine- (NSString*) description return (engine);endinterface Tier : NSObjectendimplementation Tier- (NSString*) description return (tier);endinterface Car : NSObject int tier_num; float engine_power; NSString* name; Engine* engine; Tier* tier;property (nonatomic) int tier_num;property (nonatomic) float engine_power;property (nonatomic, copy) NSString* name;property (nonatomic, retain) Engine* engine;property (nonatomic, retain) Tier* tier;endimplementation Carsynthesize tier_num;synthesize engine_power;synthesize name;synthesize engine;synthesize tier;- (id) init if (self = super init) tier_num = 4; engine_power = 100; name = BMW; return self;endint main (int argc, const char * argv) NSAutoreleasePool * pool = NSAutoreleasePool alloc init; Car* car = Car alloc init; NSLog(number of tiers is %dn, car.tier_num); NSLog(cars name is %an, ); = Mazd; Engine* newEngine = Engine alloc init; car.engine = newEngine; / insert code here. pool drain; return 0;额外的内容默认的propety变量,总是可读写的,如果需要只读控制,就用readonly,这时编译器不会生成setter方法,如property (readonly) float something;什么是property?property是一种代码生成机制,能够生成不同类型的gettersetter函数,特别是如果你想要用点(.)操作符号来存取变量的话,你就能必须使用property。如何使用?用法如:property (attribute1,attribute2) float value;这些attribute包括:readonly只读,只能读取而不能设定值(不能用setXXXX的函式)。readwrite可读可写(默认)。assign在设值时替换新旧变量(默认)。retain在设值时retain新的变量,release旧变量。copy在设值时copy一份新变量,release旧变量。nonatomic默认為atomic。前两个只是简单的设定变量的可读写性。assign只是简单的替换变量,通常运用在标量类型上,例如:NSInterger和CGRect,或者(在引用计数环境)为那些你不拥有的对象,例如:delegates。在垃圾收集环境下retain 和 assign实际上是相同的。它的产生的setter代码內容类似:- (void)setValue:(float)newValue value = newValue;retain通常用在对象类型上(在mac os x v10.6之前的版本,它只能用在objective-c 中的对象类型上,因此你不能为core foundation 的对象类型上使用retain。而mac os x v10.6和以后的版本上,你可以用_attribute_关键字来说明一个core foundation property在内存管理方面应该和objective-c 对象同样对待:property (retain)_attribute_(NSObject) CFDictionaryRef myDictionary;)比方说要声明的property对象为NSString *string,那么它的setter会是:- (void)setString:(NSString*)newString if (string != newString) string release;string = newString retain;使用retain会通知编译器对新的变量发送保留(retain)的信息,以确保变量在程序支行时不会从记忆体中被清除。copy也是通常用在必须是已经实现NSCopying协议的对象类型上,只是把刚刚retain的地方改成copy,在设定时不retain新的变量,而是copy一份給原变量成員。通常在新变量為mutable而原变量為immutable时使用,使用copy可以确保原变量仍是immutable。下面是一个不好的例子:view plain1. interfacetestViewController:UIViewController 2. NSString*teststring_A; 3. NSString*teststring_B; 4. IBOutletUITextField*textfield_1; 5. IBOutletUITextField*textfield_2; 6. 7. property(nonatomic,retain)NSString*teststring_A; 8. property(nonatomic,retain)NSString*teststring_B; 9. -(IBAction)action1:(id)sender; 10. -(IBAction)action2:(id)sender; 11. end 12. implementationtestViewController 13. synthesizeteststring_A; 14. synthesizeteststring_B; 15. -(void)dealloc 16. superdealloc; 17. 18. -(IBAction)action1:sender 19. 20. teststring_A=textfield_1.text; 21. NSLog(”teststring_Ainaction1is:%/n”,teststring_A); 22. teststring_B=textfield_2.text; 23. NSLog(”teststring_Binaction1is:%/n”,teststring_B); 24. 25. -(IBAction)action2:(id)sender 26. 27. NSLog(”teststring_Ainaction2is:%/n”,teststring_A); 28. NSLog(”teststring_Binaction2is:%/n”,teststring_B); 29. 在这个例子中点第一个按钮后,在点第二个按钮时,程序输出为:view plain1. 2010-11-1915:32:14.827test419:207teststring_Ainaction1is:123 2. 2010-11-1915:32:14.829test419:207teststring_Binaction1is:456 3. 2010-11-1915:32:14.927test419:207teststring_Ainaction2is:123 4. 2010-11-1915:32:14.929test419:207teststring_Binaction2is:( 5. 6. ) 可以看出的teststring_B的值已经不对了,而且有时候程序可能会崩溃掉!为什么不加self会有这么严重的后果呢?网上查到一篇讲得很好的解释。大至意思是这样:变量和属性是不同的,属性是建立在变量的基础上的,但是实际上它是方法。在这里你定义了一个名为teststring_B的属性,这个属性retain了赋给它的任何东西(当然也释放了旧的值)。与这个属性等同的方法看赶来像这样(简化版):view plain1. -(NSString*)teststring_B 2. /Returnthecontentofthevariableteststring_B. 3. returnteststring_B; 4. 5. -(void)setTeststring_B:(NSString*)val 6. /Retainnewvalue. 7. valretain; 8. /Releaseoldvalueinvariableteststring_B 9. teststring_Brelease; 10. /Assignthenew,retainedvaluetovariableteststring_B 11. teststring_B=val; 12. 同在你可以以两种方式使用这个属性:self setTeststring_B:foo 或者slef.teststring_B = foo;重点是后面一种使用方式仅仅是一种方便的写法,编译器将会把它翻译成前面一种的形式,即:把slef.teststring_B = foo; 转化成self setTeststring_B:foo。现在来解释一下为什么程序崩溃掉:你已经获得了一个很有可能会被autoreleased的string value,因为前面没有加self,现在你只是很简单的把这个值赋给变量teststring_B,而不是属性teststring_B。而且,你也忘记了应该要retain这个在属性中会为你retain的值。现在变量teststring_B被赋给的值是autorelease的(它不知道你已经有一个变量一直指向这个值)然后,最好的情况是一个新的对象被生成,而且内存正好分配在将被autorelease的值的内存,这样即使这个值被release了,你在后面使用的时候程序也不会崩溃。但是不管在什么情况下,变量teststring_B指向的内存中的值已经不是你认为它应该是的值了,可能是别的其它变量的值(或者垃圾)。你可以这样来修改你的程序:view plain1. /Firstretain,thenrelease;itmightbethesameobject 2. /andifyouwouldreleaseitfirstitsretaincountmight 3. /dropto0andgetcleanedupbeforeyoucanretainitagain. 4. NSString*tmp=textfield_2.textretain; 5. teststring_Brelease; 6. teststring_B=tmp; 7. /Better! 8. self.teststring_B=textfield_2.text; property实现的指令有两个:synthesize和dynamicsynthesize没啥可说的,说说dynamic吧。您可以使用dynamic关键字来告诉编译器,你将通过属性暗示或者直接用方法实现或在运行时使用诸如代码动态加载或其动态方法解析机制来履行此API的约定。它会抑制编译器在不能找到合适的实现时生成的警告。当您知道该方法将在运行时可用时,就可以使用它。下面是一个使用的例子:view plain1. interfaceMyClass:NSManagedObjectproperty(nonatomic,retain)NSString*value;end 2. implementationMyClassdynamicvalue;end 有关于Property Redeclaration你可以在子类中重新声明一个属性,但是你必须在子类中完全重复在父类中已有的其它attributes(除了readonly 与readwri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论