标签:不能 views end 设值 oca 标识 优化 apple integer
这个属性有nonatomic。 strong。 weak, retain。 copy等等
它是一个默认的特性,可是非常少使用,由于比較影响效率,这跟ARM平台和内部锁机制有关。
有时候为了语意更明白可能须要自己定义訪问器的名字:
@property (nonatomic, setter = mySetter:,getter = myGetter ) NSString *name;
最常见的是BOOL类型。比方标识View是否隐藏的属性hidden。能够这样声明:
@property (nonatomic,getter = isHidden ) BOOL hidden;
@property有显示的内存管理策略。这使得我们仅仅须要看一眼@property声明就明白它会如何对待传入的值。
assign
(默认):assign用于值类型。如int、float、double和NSInteger。CGFloat等表示单纯的复制。
还包含不存在全部权关系的对象,比方常见的delegate。
@property(nonatomic) int running;
@property(nonatomic,assign) int running;
以上两段代码是同样的。
在setter方法中,採用直接赋值来实现设值操作:
-(void)setRunning:(int)newRunning{
_running = newRunning;
}
retian
:在setter方法中,须要对传入的对象进行引用计数加1的操作。
简单来说,就是对传入的对象拥有全部权,仅仅要对该对象拥有全部权,该对象就不会被释放。
例如以下代码所看到的:
-(void)setName:(NSString*)_name{
//首先推断是否与旧对象一致,假设不一致进行赋值。
//由于假设是一个对象的话,进行if内的代码会造成一个极端的情况:当此name的retain为1时。使此次的set操作让实例name提前释放。而达不到赋值目的。
if ( name != _name){
[name release];
name = [_name retain];
}
}
copy
:在setter方法中,首先复制传入的參数。然后将原来的旧值release。新的数值复制上去。
-(void)setName:(NSString*)newName{
if(newName!=name){
[name release];
name=[newName copy];
}
}
注意
:Foundation中可复制的对象,当我们copy的是一个不可变的对象的时候。它的作用相当与retain(cocoa做的内存优化)比方我们对NSString进行copy,copy得到的地址是不变的。
以下四段代码中,第一段显示的结果不会copy,而是retain.
NSLog(@"====================================================================================");
NSString *sstr = [NSString stringWithFormat:@"dfa"];
NSLog(@"strassign:%p, count:%ld", sstr , [sstr retainCount]);
NSString *sstr2 = [sstr copy];
NSLog(@"strassign:%p, count:%ld", sstr2 , [sstr2 retainCount]);
NSLog(@"====================================================================================");
NSLog(@"====================================================================================");
NSString *sstr = [NSString stringWithFormat:@"dfa"];
NSLog(@"strassign:%p, count:%ld", sstr , [sstr retainCount]);
NSString *sstr2 = [sstr mutableCopy];
NSLog(@"strassign:%p, count:%ld", sstr2 , [sstr2 retainCount]);
NSLog(@"====================================================================================");
NSLog(@"====================================================================================");
NSMutableString *str = [NSMutableString stringWithFormat:@"dfa"];
NSLog(@"strassign:%p, count:%ld", str , [str retainCount]);
NSMutableString *str2 = [str copy];
NSLog(@"strassign:%p, count:%ld", str2 , [str2 retainCount]);
NSLog(@"====================================================================================");
NSLog(@"====================================================================================");
NSMutableString *str = [NSMutableString stringWithFormat:@"dfa"];
NSLog(@"strassign:%p, count:%ld", str , [str retainCount]);
NSMutableString *str2 = [str mutableCopy];
NSLog(@"strassign:%p, count:%ld", str2 , [str2 retainCount]);
NSLog(@"====================================================================================");
strong
:strong是在IOS引入ARC的时候引入的关键字,是retain的一个可选的替代。表示实例变量对传入的对象要有全部权关系。即强引用。strong跟retain的意思同样并产生同样的代码。可是语意上更好更能体现对象的关系。
weak
:在setter方法中。须要对传入的对象不进行引用计数加1的操作,和assign类似。
简单来说,就是对传入的对象没有全部权,当该对象引用计数为0时,即该对象被释放后。用weak声明的实例变量指向nil,即实例变量的值为0。
把对象想象成一条狗,它要跑 (be deallocated)。强指针就像一条拴在狗脖子上的狗链。仅仅要攥在手里。狗就跑不了。假设5个人攥着5条狗链都拴着狗 (5个强指针指向对象),除非5条狗链都撒开,狗就跑不了。
弱指针就像是孩子指着狗喊“看!
狗!
”。仅仅要狗链还拴着狗,孩子就能指着狗喊。
当全部狗链都撒开,无论有多少孩子指着狗喊。狗都跑了。当最后一个强指针不再指向对象,对象就会被释放,全部弱指针清零。我们什么时候使用弱指针呢?仅仅有当你想避免保留循环 (retain cycles,) 时。我们才使用它。
标签:不能 views end 设值 oca 标识 优化 apple integer
原文地址:http://www.cnblogs.com/lytwajue/p/7351041.html