readonly和retain区别

在官方的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,编译无法通过

你可能感兴趣的:(readonly和retain区别)