在目标CI中,在变量名称之前看到许多带有下划线的代码,例如_someVariable
这是为什么?还有如何编写访问器,即获取和设置这种变量的方法.
下划线通常用于表明变量是实例变量.这并不是必需的,因为ivars可以与其属性和访问者具有相同的名称.
例:
@interface MyClass : NSObject {
NSString *_myIVar; // can be omitted, see rest of text
}
// accessors, first one is getter, second one is setter
- (NSString *) myIVar; // can be omitted, see rest of text
- (void) setMyIVar: (NSString *) value; // can be omitted, see rest of text
// other methods
@property (nonatomic, copy) NSString *myIVar;
@end
Run Code Online (Sandbox Code Playgroud)
现在,您可以让编译器执行此操作,而不是对访问器myIVar和setMyIVar:您自己进行声明和编码.在较新的版本中,您甚至不必myIVar在界面中声明.您只需声明属性并让编译器为您合成其余的属性.在.m文件中,您执行以下操作:
@implementation MyClass
@synthesize myIVar; // generates methods myIVar and setMyIVar: for you,
// with proper code.
// also generates the instance variable myIVar
// etc...
@end
Run Code Online (Sandbox Code Playgroud)
一定要完成字符串:
- (void) dealloc {
[myIVar release];
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
FWIW,如果你想做的不仅仅是getter或setter的默认实现,你仍然可以自己编写一个或两个代码,但是你也必须要处理内存管理.在这种情况下,编译器将不再生成该特定访问器(但如果只有一个手动完成,则另一个仍将生成).
您可以访问属性
myString = self.myIVar;
Run Code Online (Sandbox Code Playgroud)
或者,从另一个班级:
theString = otherClass.myIVar;
Run Code Online (Sandbox Code Playgroud)
和
otherClass.myIVar = @"Hello, world!";
Run Code Online (Sandbox Code Playgroud)
在MyClass的,如果省略self.,你得到的裸伊娃.这通常只应在初始化程序和dealloc中使用.
| 归档时间: |
|
| 查看次数: |
12581 次 |
| 最近记录: |