大致思路声明属性为只读,但是重写setter赋值方法,具体实现如下:
import <Foundation/Foundation.h>
@interface Person : NSObject
@property(nonatomic,readonly,copy)NSString * name;//外部只读属性
+(id)shareManager;
@end
.m 中重写setter方法
@synthesize name =_name;
-(void)setName:(NSString *)name
{
if (_name!=name) {
[_name release];
[name retain];
_name = name;
}
}
-(void)logRetainCount{
NSLog(@"--%s--%@--%ld",func,self,CFGetRetainCount((__bridge CFTypeRef)(self)));
}
+(id)shareManager{
Person * person = [[Person alloc] init];
[person logRetainCount];
person.name = @"123";
[person test];
return person;
}
-(void)test{
self.name = @"123124";
}
由于类是使用MRC 创建的 所以setter方法 里面出现了 retain 以及 release
编译发现 正常能在类内部修改 属性
但是在外部创建时候 使用:
Person * person = [Person shareManager];
person.name = @"123";
会出现警告 name为只读属性。
当然使用KVC赋值可以。
网友评论