iOS笔记—property

本文详细介绍了Objective-C中使用@property声明属性的方法,包括如何自定义setter和getter方法名称,以及如何指定属性的读写权限和其他特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的方法就可以调用到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值