iOS开发之OC语法基础(三)--属性、点语法

本文介绍了Objective-C中的属性概念及其使用方法,包括属性的声明、实现及特性设置等内容,并探讨了点语法的应用。

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

一、目标

1、能够区别属性和实例变量
2、熟练使用属性和点语法
3、熟练掌握封装(面向对象三大特性之一)

二、属性

场景:一个类包含100个甚至更多实例变量,我们需要为每个实例变量进行赋值操作。
解决方式1:写100个设置器和100个访问器。
解决方式2:OC 2.0中定义了属性(property)的概念,属性是一组设置器和访问器,它简化了上述的操作,与类相似,属性需要声明和实现
1、属性的声明
属性的声明:
属性的声明写在类的.h文件中
@property int age;
相当于声明了两个方法:
- (void)setAge:(int)age;
- (int)getAge;
2、属性的实现
属性的实现写在类的.m文件中
@synthesize age = _age;
相当于实现了两个方法:
- (void)setAge:(int)age{
	_age = age;
}
- (int)getAge{
	return _age;
}
3、为Person类添加三个属性
Person.h
#import <Foundation/Foundation.h>

@interface Person : NSObject

@property NSString *name;
@property NSInteger age;
@property NSString *gender;

//添加初始化方法
- (id)initWithName:(NSString *)__name;

- (void)sayHi;
@end
Person.m
#import "Person.h"

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

- (id)initWithName:(NSString *)__name{
    self = [super init];
    if (self != nil) {
        self.name = __name;
    }
    return self;
}
- (void)sayHi{
    NSLog(@"%@ Hello World",self.name);
}
@end
main.m
#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {
    Person *person = [[Person alloc]initWithName:@"hehe"];
    [person sayHi];
    
    [person setName:@"Jack"];
    [person sayHi];
    
    person.name = @"xiaoming";
    
    [person sayHi];
    
    return 0;
}
注意:在声明属性和实现属性的地方会有异常,这里先跳过不处理。

三、属性的特性

刚才上面说的有异常,是因为我们没有为我们定义的属性设置特性。
属性也可以设置特性(attribute)主要包括三个方面:读写特性、原子性特性、setter语义特性
1、读写特性
读写属性可以通过厦门关键字进行设置:
readwrite 可读写(既有设置器也有访问器)默认
readonly  只读(只有访问器没有设置器)
getter = 方法名  指定访问器的方法名
setter = 方法名  指定设置器的方法名
2、原子性属性
原子性属性可以通过下面关键字设置:
nonatomic  非原子性,不保证多线程安全
atomic  原子性,多线程访问时较安全
3、语义属性
语义属性可以通以下关键字设置:
accign 直接赋值 适用于基本数据类型
retain 赋值时做内存优化  适用于对象类型
copy 复制一个副本  适用于特殊的对象类型
四、点语法
一旦我们有了实例变量的设置器和访问器就可以使用OC的点语法
比如:p.age = 20;  等价于 [p setAge:20];
   int age = p.age;  等价于 int age = [p getAge];

五、小结

1、属性和实例变量是不同的,前者是一组方法,后者是一个变量
2、定义属性@property 和 @synthesize
3、基本数据类型使用assign,对象类型使用ratain,实现了NSCopying协议的对象使用copy
4、点语法和[receiver message]是等价的


总结
如果只有访问器,能使用点语法吗?只有设置器呢?
术语和技巧
@synthesize age = _age;作用是setAge:以及age方法都是在操作实例变量_age,没有_age的话,编译器会帮你生成_age






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值