在Objective-C中,有两种声明变量的方法,第一种直接声明:
@interface Person : NSObject
{
NSString *name;
NSString *sex;
NSString *age;
Hand *hands[2];
Foot *foots[2];
}
第二种可以使用属性,关键字@property,顾名思义,属性就是将变量看作是类的属性:
@interface Person : NSObject
{
NSString *name;
NSString *sex;
NSString *age;
Hand *hands[2];
Foot *foots[2];
}
@property Foot* leftfoot;
@property Foot* rightfoot;
@property Hand* lefthand;
@property Hand* righthand;
属性与直接声明变量不同的地方在于,如果直接声明,在外面要想访问name,需要设置他的setter,getter方法,不能直接访问。
如果使用属性的方法,可以这样进行访问
Person *person = [Person new];
person.leftfoot = [Foot new];
[person setLeftfoot:[Foot new]];
Foot *foot1 = [person leftfoot];
Foot *foot2 = person.leftfoot;
如果实在类的内部可以像这样访问:
-(void)desc{
[self.leftfoot desc];
[_leftfoot desc];
}
self.leftfoot与_leftfoot的访问效果是一样的。
属性的声明是可以带参数的,如下:
@property (nonatomic,strong) Foot* leftfoot;
nonatomic和strong都是属性的参数,代表参数的一些特性:
atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。
设置成员变量的@property属性时,默认为atomic,提供多线程安全。
nonatomic禁止多线程,变量保护,提高性能。
@property (nonatomic,assign) Foot* leftfoot;
@property (nonatomic,retain) Foot* rightfoot;
person.leftfoot = [Foot new];
person.rightfoot = [Foot new];
Foot *foot1 = person.leftfoot;
Foot *foot2 = person.rightfoot;
这是对于leftfoot,编译器就会爆出warning:
/Users/umeng/iosdev/Foundation/Foundation/main.m:17:25: Assigning retained object to unsafe property; object will be released after assignment
关于copy与retain,其实都会在赋值的时候,先释放,但是一个是执行copy,一个是执行retain,这里举个例子,可能大家就明白了:
@property (nonatomic,copy) NSString* test;
@property (nonatomic,retain) NSString* test2;
然后进行赋值:
NSMutableString *s = [[NSMutableString alloc]initWithString:@"hello"];
Person *person = [Person new];
person.test =s;
person.test2 =s ;
[s appendString:@" world"];
NSLog(@"%@:%@",person.test,person.test2);
结果:
weak 和 strong 属性只有在你打开ARC时才会被要求使用,这时你是不能使用retain release autorelease 操作的,因为ARC会自动为你做好这些操作,但是你需要在对象属性上使用weak 和strong,其中strong就相当于retain属性,而weak相当于assign。
readwrite 是可读可写特性;需要生成getter方法和setter方法时使用。
readonly 是只读特性 ,只会生成getter方法,不会生成setter方法 ;不希望属性在类外改变。
对比代码效果更好一些,我将代码放在了github上:
https://github.com/mymdeep/OC_foundation
*更多的开发知识,可以关注我的公众号: