OC学习之@property和点语法

本文介绍Objective-C中如何通过setter和getter方法访问类的成员变量,并探讨@property特性及其实现原理。展示了不同属性修饰符的作用。

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

OC中类的成员变量默认是@protect,外界无法访问类的成员变量,所以通常我们在类文件中声明变量时会同时声明setter跟getter两个方法方便我们获取变量和修改(下面所有代码均在ARC模式下实现)
Person.h文件

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    int _age;
    NSString * _name;
}

- (void)setAge: (int)age;   //setter方法
- (int)age;                 //getter方法
- (void)setName: (NSString *)name;

@end
Person.m文件
#import "Person.h"

@implementation Person

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

- (int)age
{
    return _age;
}

- (void)setName: (NSString *)name
{
    _name = name;
}

@end
Main.m文件


在创建了setter方法跟getter方法之后,我们可以在main函数中访问到Person中的_age变量,也可以对age进行修改。而name变量我们只给它创建了setter方法,然后在访问变量时报错了。

为了进一步证明▪语法确实调用了这些方法,我在age的两个方法里加上断点,然后运行测试

说明了点语法实际上在我们使用时并不是直接访问变量,而是使用getter跟setter的方法来进行成员变量的访问和修改。那么为了说明属性@property的特性,我们将Person.m文件中的setter和getter方法全部清除掉,重写Person.h
#import <Foundation/Foundation.h>

@interface Person : NSObject

@property (assign, nonatomic) int age;
@property (copy, nonatomic) NSString * name;

@end
Person.m

#import "Person.h"

@end

修改完后我们直接运行main.m的原先代码,输出

要知道我们在新的Person文件里没有创建任何getter跟setter方法,但是我们可以直接使用这两个成员变量了,这是因为我们使用@property的时候编译器会自动帮我们生成getter和setter方法。当然了,我们可以在.m文件中使用关键字@dynamic加上变量名告诉编译器不要为这些变量自动生成这些方法

这次访问失败,程序运行crash了
关于@property括号中的属性表达的意思如下:
assign 简单赋值,引用计数不增加
readwrite 读写操作,默认
readonly 只读属性
copy 深复制
retain 保留对象
strong 保留对象
weak 不保留对象,对象为空时自动变为nil
nonatomic 非原子性,不对线程加锁,高性能
atomic 多线程加锁,性能低

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值