readonly和retain区别

本文详细解释了Objective-C中@property修饰符的用法,特别是readonly和retain的作用,并通过实例展示了如何实现只允许类内部修改而外部不可修改的属性。

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

在官方的SDK中经常看到一些属性声明为@property(nonatmoic,readonly,retain)NSString* strName;等等,

例如在UITableViewCell的声明中就有如下代码

@property(nonatomic,readonly,retain) UILabel      *textLabel __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
结合objective-c 语法讲解来理解,对很多初学者甚至开发了很长时间的程序猿来说都很费解
readonly:代表只读,外围不能赋值
retain:代表可以赋值,(3个步骤,先retain传入参数,再释放老属性对象,最后将参数赋值给属性)


那么,我想既然官方有这种用法,肯定有它的实际用处的,经过几番波折终于弄明白了,写出来以飨读者。
比方:
在类内部想使用  self.strName = @"new name"; 
而在外部不能使用pObject.strName = @"new name"; 
那么你应该使用这种方式


以下为代码示例:
// MyClass.h
@interface MyClass:NSObject
{
NSString* strName;
}
@property (nonatomic,readonly,retain) NSString* strName;
@end
// MyClass.m
// 首先增加私有方法声明(至于什么是私有方法请自行搜索)
@interface MyClass(Private)
@property (nonatomic,readwrite,retain) NSString* strName;//在.m范围内部重写暴露属性的一些特征
-(void)myPrivateFunction:(NSString*)strNewName;
@end


@implememtation MyClass
@synthesize strName;


-(void)myPrivateFunction:(NSString*)strNewName
{
     self.strName = strNewName;//OK,编译运行一切ok
}
@end


那么在别的类中使用这个类的对象时,
MyClass* pObj;
pObj = [MyClass new];
pObj.strName = @"New name"// wrong,编译无法通过
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值