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