Objective-C属性,它是公开的只读属性,但具有私有setter

Objective-C属性,它是公开的只读属性,但具有私有setter,objective-c,properties,Objective C,Properties,我想使用@property语法来声明一个合成属性,该属性是公开只读的,但有一个setter,可以从类内私下调用 由于它是Objective-C,这基本上意味着将合成setFoo:方法,但在类本身之外调用它将导致警告(无法识别的选择器)。要触发警告,我必须声明属性只读;有没有办法强制合成一个只能在类中使用的setter?我想你要找的是类扩展。您将在标题中声明属性为只读: @interface MyClass : NSObject { } @property (readonly, assign)

我想使用
@property
语法来声明一个合成属性,该属性是公开只读的,但有一个setter,可以从类内私下调用


由于它是Objective-C,这基本上意味着将合成
setFoo:
方法,但在类本身之外调用它将导致警告(无法识别的选择器)。要触发警告,我必须声明属性
只读
;有没有办法强制合成一个只能在类中使用的setter?

我想你要找的是类扩展。您将在标题中声明属性为只读:

@interface MyClass : NSObject {
}

@property (readonly, assign) NSInteger myInteger;

@end
然后在实现文件中重新声明类扩展名:

@interface MyClass ()

@property (readwrite, assign) NSInteger myInteger;

@end


@implementation MyClass

@end

要了解更多信息,请查看苹果的

我可能会迟到,但没有延长时间,我使用了以下技术

@interface MyClass : NSObject {
 NSString * name;
}

@property (readonly, strong) NSString * name;

@end
另一方面在实现文件中

@implementation MyClass
 @synthesize name;

 - (id)initWithItems:(NSDictionary *)items {
self = [super init];
if(self)
{ 
  name = @"abc";
}

return self;
}

@end
这样做将设置您的值,并可作为只读访问。
谢谢。

您说得对,另请参见这是一种在保持必要封装的同时利用属性便利性的好方法。:)喜欢这个功能。更新的文档链接:有人真的测试过这个吗?尝试使用点表示法设置属性会导致编译器错误(良好),但使用setMyInteger:方法只会收到编译器警告,并且当应用程序运行时,“readonly”属性确实会更改。@jk7这是正确的行为;编译器告诉你你做错了。运行时可以“自由”违反这一点。