概念:@property name: setter方法+getter方法+_name
1. 声明
@property (nonatomic, copy) NSString *name; //自动合成
@property (nonatomic, copy) NSString *sex;
2. 定义
/*
两个一起写会报错,因为重写了get和set方法,编译器认为开发者想手动管理@property,此时会将@property作为@dynamic来处理
因此也就不会自动生成变量。解决方法,显示的将属性和一个变量绑定:@synthesize name = _name;
@synthesize name = _name;
*/
// 自动合成
@synthesize name = _name;
- (void)setName:(NSString *)name{
_name = name;
}
//get 不能使用self. 会造成死循环
-(NSString *)name{
return _name;
// return self.name; // 错误的写法,会造成死循环
}
3. 使用
int main(int argc, const char * argv[]) {
@autoreleasepool {
Animal *an = [[Animal alloc] init];
an.name = @"bug";
an.sex = @"femail";
NSLog(@"animal name:%@ sex:%@", an.name, an.sex);
}
return 0;
}
4. 扩展(手动合成)
@interface Animal : NSObject{
NSString *_sex;
}
//手动合成
@dynamic sex;
-(void)setSex:(NSString *)sex{
_sex = sex;
}
-(NSString *)sex{
return _sex;
}
@end
5. @property修饰符
/*
1. 修饰符种类
原子性-nonatomic, atomic
读写权限-readwrite和readonly
内存管理-assign,strong,weak,copy,unsafe_unretained
set、get方法
2. weak和assign的区别
a) Weak修饰对象,对象释放后,引用计数为0,对象会被置为nil。
b) assign修饰基本数据类型,如果用assign修饰对象,对象释放后,引用计数为0后,
对象会变成野指针,容易崩溃。为什么基本数据类型不会,因为基本数据类型是在栈上面,不是在堆上面的。
3. copy和strong
copy 是深拷贝
strong 是浅拷贝
*/
网友评论