大致思路聲明屬性為只讀,但是重寫(xiě)setter賦值方法,具體實(shí)現(xiàn)如下:
import <Foundation/Foundation.h>
@interface Person : NSObject
@property(nonatomic,readonly,copy)NSString * name;//外部只讀屬性
+(id)shareManager;
@end
.m 中重寫(xiě)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";
}
由于類(lèi)是使用MRC 創(chuàng)建的 所以setter方法 里面出現(xiàn)了 retain 以及 release
編譯發(fā)現(xiàn) 正常能在類(lèi)內(nèi)部修改 屬性
但是在外部創(chuàng)建時(shí)候 使用:
Person * person = [Person shareManager];
person.name = @"123";
會(huì)出現(xiàn)警告 name為只讀屬性。
當(dāng)然使用KVC賦值可以。