成员变量的作用域
成员变量有四种作用域:
1.@public // 公共,即只要是声明了该头文件的文件内都可以直接调用。
2.@private //
只有自己的set、get方法可以调用。为系统默认
3.@protect //
自己和子类的set、get方法可以调用。
4.@package //在同一框架下可以调用,这个适用于自己开发框架的项目,一般用不到的。
在声明成员变量的时候就不需要写一大堆的无聊的代码啦,直接一个@property搞定所有你想做的事情。
@interface Person : NSObject
{
int_age;
}
-(void)setAge:(int)age;
-(int)age;
@end
@implementationPerson
-(void)setAge:(int)age
{
_age =age;
}
-(int)age
{
return_age;
}
@end
现在的代码是这样的:
@interface Person : NSObject
@property intage;
@end
是不是很简单?
因为苹果官方默认的是,使用@property自动创建相应类型的下划线成员变量,并且直接生成该成员变量的set方法和get方法,这种创建的成员变量为默认的@private,省去了程序员大部分的无用时间。
这个@property直接生成相关代码是一步一步演变过来的,其中有一段时间我们需要在@implementation下写这个代码:
@implementation Person
@synthesizeage;
@end
@implementationPerson
@synthesize age :_age;
@end
来告诉Xcode要生成成员变量和set、get方法,当然现在完全没有必要这样写了,这样按照第一种方式写的后果就是,你创建的不是带下划线的成员变量,而是没有下划线的成员变量。
so,亲们直接使用@property就好了。
@property参数:
原子属性:
nonatomic:该变量为非线程安全型,访问速度快,多个线程可以同时对其进行访问,需要注意的是,当两个不同的线程对其访问时,容易失控
atomic:默认属性,该变量为线程安全型,多线程中只能有一个线程对它进行访问,影响访问速度,在非ARC情况下,徐傲设置访问锁来保证对该变量进行正确的get/set。
strong:ARC中的默认属性,成员变量为强指针,相当于非ARC中的retain。
weak:ARC中的属性,成员变量为弱指针,相当于非ARC中的assign。
assign:适用于OC对象的简单数据类型,简单赋值,不更改索引计数。
retain:使用了引用计数,retain+1,当计数为0时调用dealloc释放内存,ARC下不可用
copy:用于非共享内存,每个指针都有自己的内存空间。
readonly:只读属性,只有get方法,没有set方法。
readwrite:默认的可读可写属性,有get和set方法。
unsafe_unretauined:在ARC中与assign类似,只是告诉ARC如何正确的调用声明为unsafe_unretauined变量的retain和release。
@property详解
例如原来的代码是这样的:
有的时候我们想自己定义set方法和get方法怎么办呢?因为有的时候赋值是需要条件的呀,那么可以用以前的方法,直接在@implementation下写set方法和gei方法,自己写的set方法和get方法会默认覆盖系统自动生成的set方法和get方法。
或