大致思路聲明屬性為只讀,但是重寫setter賦值方法邦投,具體實現(xiàn)如下:
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 創(chuàng)建的 所以setter方法 里面出現(xiàn)了 retain 以及 release
編譯發(fā)現(xiàn) 正常能在類內(nèi)部修改 屬性
但是在外部創(chuàng)建時候 使用:
Person * person = [Person shareManager];
person.name = @"123";
會出現(xiàn)警告 name為只讀屬性伤锚。
當然使用KVC賦值可以。