Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Objective-C属性中,仅当变体保持私有时才公开访问器_Objective C_Properties_Encapsulation_Accessor_Mutators - Fatal编程技术网

在Objective-C属性中,仅当变体保持私有时才公开访问器

在Objective-C属性中,仅当变体保持私有时才公开访问器,objective-c,properties,encapsulation,accessor,mutators,Objective C,Properties,Encapsulation,Accessor,Mutators,假设我有一个带有一些实例变量的类,我想通过点表示法属性公开这些i-vars,以便“只读”使用,但同时能够使用类内的属性Mutator,也可以使用点表示法 问题是,我在.h文件中声明如下: @property (readonly) .... @inteface MyClass() @property (retain) myIvar; @end 然后,即使我自己编写mutator(-(void)setMyIvar:),我也不能将它与点符号一起使用,因为编译器(正确地)抱怨该属性是只读的 我尝试在

假设我有一个带有一些实例变量的类,我想通过点表示法属性公开这些i-vars,以便“只读”使用,但同时能够使用类内的属性Mutator,也可以使用点表示法

问题是,我在.h文件中声明如下:

@property (readonly) ....
@inteface MyClass()
@property (retain) myIvar;
@end
然后,即使我自己编写mutator(
-(void)setMyIvar:
),我也不能将它与点符号一起使用,因为编译器(正确地)抱怨该属性是只读的

我尝试在我的.m文件(在接口扩展名内)中重新声明属性,如下所示:

@property (readonly) ....
@inteface MyClass()
@property (retain) myIvar;
@end
但是编译器不接受这个双重声明


我有什么办法可以做到吗?

你可以这样做,但你必须这样做:

@property (retain,readonly) ....
在您的实施中:

@inteface MyClass()
@property (retain,readwrite) myIvar;
@end

换句话说,除了可访问性之外,声明应该是相同的。

这是一个很好的答案!我从未意识到属性的可访问性和属性的“属性”之间存在分离。