Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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 目标C:(私有/公共属性)为外部类调用使属性只读,为自身调用使属性读写_Objective C_Cocoa - Fatal编程技术网

Objective c 目标C:(私有/公共属性)为外部类调用使属性只读,为自身调用使属性读写

Objective c 目标C:(私有/公共属性)为外部类调用使属性只读,为自身调用使属性读写,objective-c,cocoa,Objective C,Cocoa,您知道一种方法可以使属性对于外部调用为只读,对于内部调用为readwrite吗 我以前读过很多次类似的东西 在 @property(nonatomic, readonly) NSDate* theDate; 在下午 @interface TheClassName() @property(nonatomic, retain) NSDate* theDate; @end 但在编译.m“属性时,ClassName类continuation中的Date属性与ClassName类属性不匹配”时会发出警

您知道一种方法可以使属性对于外部调用为只读,对于内部调用为readwrite吗

我以前读过很多次类似的东西

@property(nonatomic, readonly) NSDate* theDate;
在下午

@interface TheClassName()
@property(nonatomic, retain) NSDate* theDate;
@end
但在编译.m“属性时,ClassName类continuation中的Date属性与ClassName类属性不匹配”时会发出警告

不管怎么说,这似乎是有效的(可以阅读,但不能从课堂外设置,可以从课堂内同时进行),但我应该错过一些避免警告的内容。
或者,如果您知道一种更好的方法…

在.m中,您不应该再次放置@property。不过,我不确定这会有什么影响。 你想用@synthesis吗

请注意,无论如何,日期都将在类实现内部读/写,而不管对外部是只读的。

在您的.h中:

@property(nonatomic, retain, readonly) NSDate* theDate;
在您的.m中:

@interface TheClassName()
@property(nonatomic, retain, readwrite) NSDate* theDate;
@end

如果属性由变量支持,则默认情况下该变量是从类内部读写的。将属性设置为只读,即可实现您的设计目标。在类内部,引用变量时不要在前面加上self。

如果您移动到ARC,这个问题基本上就消除了。不需要两个属性声明,而是在头中声明一次

@property(nonatomic, readonly) NSDate* theDate;
然后在类扩展中,只需声明一个_强实例变量

@interface TheClassName()
{
    __strong NSDate* _theDate;
}
@end
_theDate = [NSDate date];
并在实施中进行适当的综合

@implementation TheClassName
@synthesize theDate = _theDate;
现在可以设置实例变量

@interface TheClassName()
{
    __strong NSDate* _theDate;
}
@end
_theDate = [NSDate date];

ARC将神奇地将适当的保留/释放功能嵌入到代码中,以将其视为强/保留变量。它的优点是比旧式(retain)属性更快,并且在编译时将retain/release代码内联。

他使用的是类扩展。这可以用于私有财产,也可以在
self
上调用。目前还不清楚奥利弗是否正试图实现这一目标,但如果是,那么这是一个很好的答案。Vikingosegundo,你应该把它作为一个答案,奥利弗可以接受!他在问,如何实现公共只读属性,而另一个私有属性具有读写访问权限。我从来没有做过这样的事。我刚才向你解释过,他正在使用一个类扩展,但它没有回答这个问题。-1:即使在引用自己的实例变量时,也有很多很好的理由使用访问器。(内存管理是其中之一。)Oliver的问题是正确的。+1,可能还想删除
readwrite
,因为这是默认值,
非原子的
,直到真正需要为止。
readwrite
明确表示您确切知道自己想要什么。有些人把“总是使用非原子的”这句口头禅从iOS带到可可(我当然会);这可能是一个项目范围内的政策;在这两个地方必须提到
retain
的原因是
retain
的getter的
@合成
的codegen与
assign
在某些情况下可能不同。因此,属性的只读视图上的
retain
策略是类的API/契约的一部分。谢谢我只是这么做了,想确保这是正确的。现在我确信:)谢谢你!在这种情况下,您也可以在iVar名称中省去uu,因为self.theDate会发出警告,因为没有合成getter,并且uu u u u u u u)strong可以防止您担心直接错误地不安全地设置iVar。但是,如果我希望setter或getter执行其他任务,例如广播通知,健全性检查?然后声明属性,并编写所需的任何getter或setter方法,_强声明将防止您必须在setter中实现任何保留/释放逻辑。您知道,我想说的是:如果因此使用属性调用,您将具有更高的清洁度和抽象度。