xcode @property 和 setter 和 getter
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9541828/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
@property and setters and getters
提问by iggy2012
If I create a @property and synthesize it, and create a getter and setter as well like so:
如果我创建一个@property 并合成它,并像这样创建一个 getter 和 setter:
#import <UIKit/UIKit.h>
{
NSString * property;
}
@property NSString * property;
--------------------------------
@implementation
@synthesize property = _property
-(void)setProperty(NSString *) property
{
_property = property;
}
-(NSString *)property
{
return _property = @"something";
}
Am I correct in assuming that this call
我假设这个电话是否正确
-(NSString *)returnValue
{
return self.property; // I know that this automatically calls the built in getter function that comes with synthesizing a property, but am I correct in assuming that I have overridden the getter with my getter? Or must I explicitly call my self-defined getter?
}
is the same as this call?
和这个电话一样吗?
-(NSString *)returnValue
{
return property; // does this call the getter function or the instance variable?
}
is the same as this call?
和这个电话一样吗?
-(NSString *)returnValue
{
return _property; // is this the same as the first example above?
}
回答by Darren
There are a number of problems with your code, not least of which is that you've inadvertently defined two different instance variables: property
and _property
.
您的代码存在许多问题,尤其是您无意中定义了两个不同的实例变量:property
和_property
.
Objective-C property syntax is merely shorthand for plain old methods and instance variables. You should start by implementing your example without properties: just use regular instance variables and methods:
Objective-C 属性语法只是简单的旧方法和实例变量的简写。您应该首先实现没有属性的示例:只需使用常规实例变量和方法:
@interface MyClass {
NSString* _myProperty;
}
- (NSString*)myProperty;
- (void)setMyProperty:(NSString*)value;
- (NSString*)someOtherMethod;
@end
@implementation MyClass
- (NSString*)myProperty {
return [_myProperty stringByAppendingString:@" Tricky."];
}
- (void)setMyProperty:(NSString*)value {
_myProperty = value; // Assuming ARC is enabled.
}
- (NSString*)someOtherMethod {
return [self myProperty];
}
@end
To convert this code to use properties, you merely replace the myProperty
method declarations with a property declaration.
要将此代码转换为使用属性,只需将myProperty
方法声明替换为属性声明即可。
@interface MyClass {
NSString* _myProperty;
}
@property (nonatomic, retain) NSString* myProperty
- (NSString*)someOtherMethod;
@end
...
The implementation remains the same, and works the same.
实现保持不变,工作原理相同。
You have the option of synthesizing your property in your implementation, and this allows you to remove the _myProperty
instance variable declaration, and the generic property setter:
您可以选择在您的实现中综合您的属性,这允许您删除_myProperty
实例变量声明和通用属性设置器:
@interface MyClass
@property (nonatomic, retain) NSString* myProperty;
- (NSString*)someOtherMethod;
@end
@implementation MyClass
@synthesize myProperty = _myProperty; // setter and ivar are created automatically
- (NSString*)myProperty {
return [_myProperty stringByAppendingString:@" Tricky."];
}
- (NSString*)someOtherMethod {
return [self myProperty];
}
Each of these examples are identical in how they operate, the property syntax merely shorthand that allows you to write less actual code.
这些示例中的每一个在它们的操作方式上都是相同的,属性语法只是允许您编写较少实际代码的速记。
回答by gregheo
return self.property
– will call your overridden getter.
return self.property
– 将调用您覆盖的 getter。
return _property;
– accesses the property's instance variable directly, no call to the getter.
return _property;
– 直接访问属性的实例变量,不调用 getter。
return property;
– instance variable.
return property;
– 实例变量。
EDIT: I should emphasize that you will have twodifferent NSString variables -- property
and _property
. I'm assuming you're testing the boundaries here and not providing actual production code.
编辑:我应该强调您将有两个不同的 NSString 变量 -property
和_property
. 我假设您在这里测试边界而不提供实际的生产代码。
回答by Anurag Bhakuni
above answer elaborate almost all the thing , i want to elaborate it little more.
上面的答案几乎说明了所有事情,我想再详细说明一下。
// older way
// 老方法
@interface MyClass {
NSString* _myProperty; // instance variable
}
- (NSString*)myProperty; // getter method
- (void)setMyProperty:(NSString*)value;//setter method
@end
@结尾
the instance variable can not be seen outside this class , for that we have to make getter and setter for it. and latter on synthesis it in .m file
实例变量不能在这个类之外看到,为此我们必须为它制作getter和setter。后者在.m文件中合成
but now
但现在
we only used
我们只用过
@property(nonatomic) NSString *myProperty;
the @property
is an Objective-C directive which declares the property
这@property
是一个声明属性的Objective-C指令
-> The "`nonatomic`" in the parenthesis specifies that the property is non-atomic in nature.
-> and then we define the type and name of our property.
-> prototyping of getter and setter method
now go to .m file
现在转到 .m 文件
previously we have synthesis this property by using @synthesis
, now it also not required it automatically done by IDE.
以前我们通过 using 综合了这个属性@synthesis
,现在它也不需要由 IDE 自动完成。
little addition : this `@synthesis` now generate the getter and setter(if not readonly) methods.