关于属性的个人理解

声明属性的4种方法:

//代码一:
@interface BaseClass : NSObject{
@public
NSString *_name;
}
@property(nonatomic,copy,readonly) NSString *name; //这里使用的是readonly,所有会声明geter方法

-(void) setName:(NSString*)newName;
/代码二:
@interface BaseClass : NSObject{
@public
NSString *_name;
}
@property(nonatomic,copy,readonly) NSString *name; //这里虽然声明了readonly,但是不会生成getter方法,因为你下面自己定义了getter方法。

-(NSString*) name; //getter方法是不是只能是name呢?不一定,你打开Foundation.framework,找到UIView.h,看看里面的property就明白了)
-(void) setName:(NSString*)newName;

//代码三:
@interface BaseClass : NSObject{
@public
NSString *_name;
}
@property(nonatomic,copy,readwrite) NSString *name; //这里编译器会我们生成了getter和setter

//代码四:
@interface BaseClass : NSObject{
@public
NSString *_name;
}
@property(nonatomic,copy) NSString *name; //因为readwrite是默认行为,所以同代码三
上面四段代码是等价的,接下来,请看下面四段代码:
//代码一:
@synthesize name = _name; //这句话,编译器发现你没有定义任何getter和setter,所以会同时会你生成getter和setter

//代码二:
@synthesize name = _name; //因为你定义了name,也就是getter方法,所以编译器只会为生成setter方法,也就是setName方法。

-(NSString*) name{
NSLog(@"name");
return _name;
}

//代码三:
@synthesize name = _name; //这里因为你定义了setter方法,所以编译器只会为你生成getter方法

-(void) setName:(NSString *)name{
NSLog(@"setName");
if (_name != name) {
[_name release];
_name = [name copy];
}
}

//代码四:
@synthesize name = _name; //这里你自己定义了getter和setter,这句话没用了,你可以注释掉。

-(NSString*) name{
NSLog(@"name");
return _name;
}

-(void) setName:(NSString *)name{
NSLog(@"setName");
if (_name != name) {
[_name release];
_name = [name copy];
}
}

说了这么多也该说说我的干货了(以上都是复制)
在什么时候使用@property:
1⃣️:当需要进行外部传值
2⃣️:当项目中多处用了@property 为了美观就统一使用。


在只需要在本类中使用的属性最好在

@implementation addColleageView{

    UITableView *_colleageTableViews;

}中声明属性,因为是一种国际规范(最好养成这种习惯)

 

属性名前加下滑线








































posted @ 2016-07-26 18:22  编程达人丶  阅读(428)  评论(0编辑  收藏  举报