Property 属性

2020-03-18  本文已影响0人  橙子遇到八哥

概念:@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 是浅拷贝
 */
上一篇下一篇

猜你喜欢

热点阅读