iOS笔记—property

property自动为属性生成setter和getter方法。以及能够直接设置是否生成getter和setter方法。也能够自定义setter和getter的方法名。

//
//  Person.h
//  property
//
//  Created by hhg on 15-6-8.
//  Copyright (c) 2015年 hhg. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject

/// 姓名
@property  NSString *name;

/// 年龄
@property  NSUInteger age;

/// id号码
@property  NSUInteger idNumber;

/// 是否成年
@property  BOOL adult;

一般都会指定一些权限,比如重写setter和getter名,指定非保护线程,只读等等

//
//  Person.h
//  property
//
//  Created by hhg on 15-6-8.
//  Copyright (c) 2015年 hhg. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject

/// 姓名
@property (nonatomic, copy, getter=myName, setter=setMyName:) NSString *name;

/// 年龄
@property (nonatomic, assign, readonly) NSUInteger age;

/// id号码
@property (nonatomic, assign, readwrite) NSUInteger idNumber;

/// 是否成年
@property (nonatomic, assign, getter=isAdult) BOOL adult;

// OC里面的方法名: 去掉返回值,去掉参数类型,去掉参数名,剩下的就是方法名
- (void)setAge:(NSUInteger)age;

- (void)setName:(NSString *)name andAge:(NSInteger)age andIdNumber:(NSInteger)idNumber;

// 方法名 =  setName: andAge: andIdNumber:

@end
//
//  Person.m
//  property
//
//  Created by hhg on 15-6-8.
//  Copyright (c) 2015年 hhg. All rights reserved.
//

#import "Person.h"

@implementation Person

- (void)setAge:(NSUInteger)age {
    _age = age;
}

- (void)setName:(NSString *)name andAge:(NSInteger)age andIdNumber:(NSInteger)idNumber {

    _name = name;
    _age = age;
    _idNumber = idNumber;
}

@end

调用的时候按照自定义的方法直接调用即可。

//
//  main.m
//  property
//
//  Created by hhg on 15-6-8.
//  Copyright (c) 2015年 hhg. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        Person *p = [[Person alloc] init];

        p.idNumber = 74;
        NSLog(@"%li", p.idNumber );

        p.age = 123;
        NSLog(@"%li", p.age);

        p.myName = @"张三";
        NSLog(@"%@", p.myName);

        p.adult = YES;

        NSLog(@"%d",p.isAdult);

    }
    return 0;
}

值得说一下的是,当setter方法名在property里面被改变了之后,原来的setter方法名仍旧有效。如下:

//
//  main.m
//  property
//
//  Created by hhg on 15-6-8.
//  Copyright (c) 2015年 hhg. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        Person *p = [[Person alloc] init];

        p.myName = @"张三";
        p.name = @"李四";
        NSLog(@"%@", p.myName); // 打印的结果是 李四

    }
    return 0;
}

tip:用property声明成员变量是@private。 但是在子类中能够调用父类property。原因是property生成了setter和getter方法。子类通过setter和getter的方法就可以调用到。

猜你喜欢

转载自blog.csdn.net/csdn_hhg/article/details/80490628