Objective c 目标C上的私有字段
这三种情况的区别是什么(它们都像私有字段一样使用):Objective c 目标C上的私有字段,objective-c,Objective C,这三种情况的区别是什么(它们都像私有字段一样使用): 1。 @接口操作:NSOperation @财产(副本,只读)NSData*地震数据; @结束 2. @接口解析操作() @不动产(非原子)地震*当前地震对象; @属性(非原子)NSMutableArray*currentParseBatch; @属性(非原子)NSMutableString*currentParsedCharacterData; @结束 3. @操作的实现 { NSDateFormatter*\u日期格式化程序; BOOL_
1。
@接口操作:NSOperation
@财产(副本,只读)NSData*地震数据;
@结束
2.
@接口解析操作()
@不动产(非原子)地震*当前地震对象;
@属性(非原子)NSMutableArray*currentParseBatch;
@属性(非原子)NSMutableString*currentParsedCharacterData;
@结束
3.
@操作的实现
{
NSDateFormatter*\u日期格式化程序;
BOOL_累加解析的字符数据;
布尔(BOOL)迪德伯特帕辛;;
NSUInteger(解析DearthQuakeCounter);
}
这是个好习惯还是别的
案例1。不是私人案例。它是一个公共只读属性:读取是公共的,只有在私有范围内通过底层ivar才能写入(感谢您指出@mah) Case2.(如果在
.m
文件中)通过添加3个私有属性并使协议一致性也私有来扩展类
Case3.声明了4个私有实例变量,可用于所有实现范围
Objective-C私有属性的最佳实践是case2。,因为case1。根本不是私有的,只是只读的,case3。使用实例变量(也称为ivar),这比属性更不传统。更多信息请参见:
希望这能有所帮助,我将通读您给出的每个示例,并对它们进行描述。我昨天只是有点麻烦,所以我感觉到了你的痛苦 一, 通过使用@property关键字,编译器会自动为您合成访问器方法,以及一个备份实例变量。但是,由于您使用的是
readonly
属性,因此编译器只为您合成一个getter方法
二,
对于最后一个示例,您只是声明实例变量。这些也是实现文件的私有文件,与其他两个示例一样,在类接口文件中进行了声明
编译器没有为您合成setter或getter方法。您只需声明一些实例变量
就private和public而言,第一个和第二个示例都提供了对其他类可见的声明,只要它们导入当前类的头文件。然而,第一个示例只提供了一种“获取”属性并读取它的方法,没有setter方法,因为您使用了readonly
property属性。对于第二个示例,外部类将能够访问属性的getter和setter方法,以便它们可以读写
对于第三个示例,这些只是实例变量,它们对于类的实现文件是私有的。基本上,没有一个外部班级会知道他们的存在
APLParseOperation
类的所有用户可见的公共属性@interface APLParseOperation () <NSXMLParserDelegate>
{
NSDateFormatter *_dateFormatter;
BOOL _accumulatingParsedCharacterData;
BOOL _didAbortParsing;
NSUInteger _parsedEarthquakesCounter;
}
@end
@接口操作()
{
NSDateFormatter*\u日期格式化程序;
BOOL_累加解析的字符数据;
布尔(BOOL)迪德伯特帕辛;;
NSUInteger(解析DearthQuakeCounter);
}
@结束
这和数字3没有太大区别。最好选择一种样式,并在所有代码中坚持使用它。1。属性是公共且只读的,不能从类外部更改,但可以随时读取其值,2。它仍然可以从外部读取,也可以从类外部重写,3。从类外部看不到这些内部IVAR。无法通过属性写入案例1属性,但支持值仍然可以写入。也就是说,假设没有自定义命名合成,APLParseOperation类的对象可以运行一个执行“_earthquakeData=[[NSData alloc]init…”的方法,并且它将更改从该属性读取的值。即使在私有范围内,也不可能写入。这一点都不正确,因为可以绕过setter修改属性。这在课堂上是可能的。你是对的,我修改了我的答案来反映这一点。即使在约定和最佳实践方面,您应该尽可能少地使用IVAR。。。
@interface APLParseOperation : NSOperation
@property (copy, readonly) NSData *earthquakeData;
@end
@interface APLParseOperation () <NSXMLParserDelegate>
@property (nonatomic) APLEarthquake *currentEarthquakeObject;
@property (nonatomic) NSMutableArray *currentParseBatch;
@property (nonatomic) NSMutableString *currentParsedCharacterData;
@end
@implementation APLParseOperation
{
NSDateFormatter *_dateFormatter;
BOOL _accumulatingParsedCharacterData;
BOOL _didAbortParsing;
NSUInteger _parsedEarthquakesCounter;
}
@interface APLParseOperation () <NSXMLParserDelegate>
{
NSDateFormatter *_dateFormatter;
BOOL _accumulatingParsedCharacterData;
BOOL _didAbortParsing;
NSUInteger _parsedEarthquakesCounter;
}
@end