很多网友在学习Objective - c的时候,都会对@property的使用方法感到困惑。但是呢,@property又是我们最常使用的以一种机制,很多人在抄写ios编程实战代码时,对于“@property(strong,nonatomic),@property(weak,nonatomic)"完全搞不懂,只能长叹:这是啥,这又是啥?由于市场上基础教程的书对@property的属性列表解释很少,ios大腕又懒得详细解释,所以笔者将把属性列表拆成若干个方面,用几篇博客分别解释,以求朋友间的交流,指教。
好,下面我们就进入正题。今天要讲的是大家最常见的字符串属性变量,我们经常使用使用下面类似的语句:
@property (copy,nonatomic) NSString *name; //括号里的属性列表没有顺序,可随意修改
这条语句就等价于;
- (void) setName: (NSString *) theName
{
if(theName != name){
[name release]
name = [theName copy];
}
}
那么为什么要使用copy呢,如果直接使用下面的语句,结果又将如何?
- (void) setName: (NSString *) theName
{
name = theName;
}
结果是 name 和 theName 指向同一个对象。当在调用 setName: 方法之后,如果 theName 的值被修改,那么, name 的值也将被修改,这显然不是我们想要的结果。所以,用用 copy 来拷贝 theName 的值到 name 上,其完成功能就是调用一个 alloc 方法来创建一个新的字符串对象(使用 initWithString:theName)。
也许有些朋友对这句话产生疑问:这显然不是我们想要的结果,何以见得呢。因为这种结果,创建的字符串占用的是同一堆内存空间。后果就是:如果一个字符串已经被一个名称所引用,则以后再有相同的字符串声明时,就不会重新开辟空间,而继续使用开辟好的堆内存,也就是所谓的共享设计。对于初学者来说,还是采用创建一个字符串,就开辟一个内存空间比较好。
那 nonatomic 又有神马作用呢?在多线程程序中,两个或多个线程可能在同一个时间执行同一个代码,同一个属性。为了防止这种现象的发生,开发人员可以使用互斥锁。nonatomic 的意思是不需要使用互斥锁,atomic 是使用互斥锁。Objective - c 的缺省选项是 atomic 。如果你的程序并没有使用多线程,可以把互斥锁设置为 nonatomic。
这是由于 nonatomic
PS: 本人正在学习IOS6实战开发,本身也是小白,上述博文多有不足之处,欢迎朋友们指正。也希望朋友们能多多交流,把自己编程的疑惑心得写出来,大家共同进步嘛。在后续的日子,笔者会根据实战开发中的错误,每天写点心得的,请赐教!
好,下面我们就进入正题。今天要讲的是大家最常见的字符串属性变量,我们经常使用使用下面类似的语句:
@property (copy,nonatomic) NSString *name; //括号里的属性列表没有顺序,可随意修改
这条语句就等价于;
- (void) setName: (NSString *) theName
{
if(theName != name){
[name release]
name = [theName copy];
}
}
那么为什么要使用copy呢,如果直接使用下面的语句,结果又将如何?
- (void) setName: (NSString *) theName
{
name = theName;
}
结果是 name 和 theName 指向同一个对象。当在调用 setName: 方法之后,如果 theName 的值被修改,那么, name 的值也将被修改,这显然不是我们想要的结果。所以,用用 copy 来拷贝 theName 的值到 name 上,其完成功能就是调用一个 alloc 方法来创建一个新的字符串对象(使用 initWithString:theName)。
也许有些朋友对这句话产生疑问:这显然不是我们想要的结果,何以见得呢。因为这种结果,创建的字符串占用的是同一堆内存空间。后果就是:如果一个字符串已经被一个名称所引用,则以后再有相同的字符串声明时,就不会重新开辟空间,而继续使用开辟好的堆内存,也就是所谓的共享设计。对于初学者来说,还是采用创建一个字符串,就开辟一个内存空间比较好。
那 nonatomic 又有神马作用呢?在多线程程序中,两个或多个线程可能在同一个时间执行同一个代码,同一个属性。为了防止这种现象的发生,开发人员可以使用互斥锁。nonatomic 的意思是不需要使用互斥锁,atomic 是使用互斥锁。Objective - c 的缺省选项是 atomic 。如果你的程序并没有使用多线程,可以把互斥锁设置为 nonatomic。
这是由于 nonatomic
PS: 本人正在学习IOS6实战开发,本身也是小白,上述博文多有不足之处,欢迎朋友们指正。也希望朋友们能多多交流,把自己编程的疑惑心得写出来,大家共同进步嘛。在后续的日子,笔者会根据实战开发中的错误,每天写点心得的,请赐教!