学习日记-property的参数解析

来源:互联网 发布:mp3购买推荐淘宝网 编辑:程序博客网 时间:2024/06/12 21:14

@property在OC中,特别是Xcode环境编写中,随处可见。这源于它的参数非常丰富,因此功能也十分强大。下面我就他的参数做一个简单的示例。

1、生成相关的get和set方法参数:readwrite/readonly

在编程中,我们为了类的成员变量的安全性,不允许外界随便修改和访问,会经常把这些成员变量做个一个包装—名曰封装。在以前我们经常用这种方法来封装我们的成员变量,例如,

  1. - (void)setAge :(int)age  
  2. {  
  3.          _age = age;  
  4. }  
  5.   
  6. - (int)age  
  7. {  
  8.        return age;  
  9. }  

但是,我们发现每一个成员变量都需要做上述的封装,但是他们的格式都一样,因此Xcode给我们提供了一个函数property。运用@property可以让Xcode自动生成set和get方法。常用格式:@property int age(生成声明);@synthesize age = _age(生成实现的)

在Xcode4.4以后@property int age包含了@synthesize age = _age功能。它能生成带下划线的成员变量和声明实现。但是它有以下特性:当没有成员变量时,它生成的成员变量就是一个private的变量;当我们自己写了set和get方法后他就不会给我们生成带下划线的成员变量;当我们只写了set或者get方法时,他会主动补齐另一种方法。

但是在实际编写中,我们并没有写property的参数,那是因为它默认的是readwrite,即@property(readwrite)int age;@property(readonly)int age就是只生成get方法不生成set方法,即只读。

新写法:

[objc] view plaincopy
  1. @property int age;  

2、内存管理的相关参数:retain/assign

在做内存管理的时候,我们之前一直是在set方法加入retain/release来计数对象,但是Xcode4.4以后他给我们提供了智能的内存管理,即使property自动生成对象的内存计数器。原来set的生成方法,如下:

[objc] view plaincopy
  1. - (viod)setName :(NSString *)name  
  2. {  
  3.     if(name != _name)  
  4.     {  
  5.         [self realease];  
  6.         _name = [name retain];  
  7.     }  
  8.   
  9. }  
Xcode4.4以后给我们提供了在property之后加参数retain和assign,即@property(retain)NSString *name 或者@property(assign)int age。但是我们想要注意,对于非OC对象我们就用assign,对OC对象就是用retain。有一个特殊的情况就是,当两个类互相引用时,我们为了避免发生循环引用,我们给其中一个OC对象用assign。

新用法如下:

[objc] view plaincopy
  1. @propertyretainNSString *name;  

3、set和get的方法名的改变:setter = ***/getter = ****

有时候我们想要改变set和get的方法名称的时候我们@property也提供一个参数来改名字,用法如下:

[objc] view plaincopy
  1. @propertysetter = setMyName,gtter =myName, retainNSString *name;  
一般情况下,我们不对其名称做改变,但是这可以用在BOOL的类型的变量来修改名称,便于判断。

4、Xcode  中ARC中的强弱指针:weak/strong

在ARC中一个对对象的指针的修饰的参数即,weak/strong。这weak/strong代表强弱指针,它们只有对OC对象才使用,因此能代替retain这个参数。一般情况下property默认为strong,即,@property(strong)(NSSTring *)name。在我们对那种相互引用,即发生循环时,我们给其中的一个定义为weak,弱指针。

用法:

[objc] view plaincopy
  1. @propertystrongNSString *name;  

0 0