IOS中的Propety(点语法,属性)

main.m

  
    Person *p = [[Person alloc] init];
    
    
    [p setName:@"doubi"];
    [p setGender:@"man"];
    [p setAge:23];
    
    //点语法:
     //对象.属性名
    //凡是与系统默认setter和getter方法实现相似的方法都可以使用点语法来调用.
    //如果点语法在等号的左侧,代表调用的是setter方法
    //如果点语法在等号的右侧,代表调用的是戈塔特人方法
    NSLog(@"%@,%@,%ld",p.name, p.gender, p.age);

Person.h

@interface Person : NSObject
//{
//    NSString *_name;
//    NSString *_gender;
//    NSInteger _age;
//}
/*
 属性的作用:自动生成setter以及getter方法
 属性定义@property + 属性的类型(和内部操作的实例变量的类型一致)+属性名(和内部操作的实例变量名相同)
 
 属性在.h中自动生成setter和getter方法
 
 

 */


@property NSString *name;

//- (void)setName:(NSString *)name;
//- (NSString *)name;

@property NSString *gender;
//- (void)setGender:(NSString *)gender;
//- (NSString *)gender;
@property NSInteger age;
//- (void)setAge:(NSInteger)age;
//- (NSInteger)age;


@end

Person.m

@implementation Person
/*
 当系统自动生成setter以及getter方法时,如果此时没有自己重写setter和getter方法,系统不但会帮你实现setter以及getter,而且会生成相应的实例变量,只不过实例变量是私有的,子类无法访问

 
 
 @synthesize 在.m中作用:
 (1)生成setter和getter方法的内部实现
 (2)生成setter和getter内部操作的实例变量
 
 
 //当自己实行了setter和getter方法,系统就不在帮我们生成实例变量,此时要自己定义实例变量或者使用@synthesize解决
 如果仅仅实现了setter或者getter中的一个,那么系统还会帮我们生成对应的实例变量
 
 当我写了@synthesize name = _name;这句话之后,setter和getter我即可以不写,也可以重写一个,更可以重写两个
 */


@synthesize name = _name;
@synthesize gender = _gender;
@synthesize age = _age;

//@property (nonatomic) )setName:(NSString *)name{
//    if(_name != name){
//        [_name release];
//        _name = [name retain];
//    }
//}
//
//- (NSString *)name{
//    return [[_name retain] autorelease];
//}
//当属性name的语义特性设置为copy 时的stter以及getter方法的内部实现
//- (void)setName:(NSString *)name{
//    if(_name != name){
//        [_name release];
//        _name = [name copy];
//    }
//}

//- (NSString *)name{
//    return [[_name retain] autorelease];
//}
//
//- (void)setGender:(NSString *)gender{
//    if (_gender != gender) {
//        [_gender release];
//        _gender = [gender retain];
//    }
//}
//- (NSString *)gender{
//    return [[_gender retain] autorelease];
//}

@end














/**
 *  读写特性:读-----getter,写------setter
 1.readonly:(只读)该属性只会生成getter方法,不会生成setter方法
 2.readwrite:(读写)该属性即会生成setter方法,也会生成getter方法,系统默认的特性
 3.setter = 方法名 ,指定在生成setter方法时,setter方法的方法名
 4.getter = 方法名,指定在生成getter方法时 ,getter的方法名
 */
/**
 *  原子特性
 1.atomic (原子性):保证线程安全,系统默认特性
 2.nonotomic (非原子性):不保证线程安全,系统推荐.因为对于setter以及getter方法,可能会在一段时间内频繁的调用,如果每次都要开锁,加锁,这样会非常消耗系统支援降低程序的执行效率,因此,苹果从效果上考虑,推荐大家使用nonatomic

 */

/**
 *  语义特性
 1.assign:主要针对基本数据类型, NSInterger CGFloat, BOOL,NSCOMparisonResult
 
 2.retain:只能针对与对象类型使对象的引用计数+1
 3.copy:只能针对,但是需要该类服从NSCopying协议,copy是将对象赋值出来一份,然后使赋值出来的对象的引用计数+1
 
 */



//当属性name的语义特性设置为assign时的setter以及getter方法的内部实现.(直接赋值)
//- (void)setName:(NSString *)name
//{
//    _name = name;
//}
//- (NSString *)name
//{
//    return _name;
//}
//当属性name的语义特性设置为return是的setter以及getter方法的内部事件.




//- (void)setGender:(NSString *)gender
//{
//    _gender = gender;
//}
//- (NSString *)gender
//{
//    return _gender;
//}
//
//- (void)setAge:(NSInteger)age
//{
//    _age = age;
//}
//- (NSInteger)age
//{
//    return _age;
//}

//- (id)initWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age
//{
//    if (self = [super init]) {
//        _name = name;
//        _gender = gender;
//        _age = age;
//    }
//    return self;
//}
原文地址:https://www.cnblogs.com/wohaoxue/p/4723616.html