@property和setters and getters

时间:2012-03-02 23:29:00

标签: objective-c xcode

如果我创建一个@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";
}

我在假设这个电话

时是否正确
-(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?
}

与此次通话相同?

-(NSString *)returnValue
{
    return property; // does this call the getter function or the instance variable?
}

与此次通话相同?

-(NSString *)returnValue
{
    return _property; // is this the same as the first example above?
}

3 个答案:

答案 0 :(得分:7)

您的代码存在许多问题,尤其是您无意中定义了两个不同的实例变量:property_property

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

要将此代码转换为使用属性,只需使用属性声明替换myProperty方法声明。

@interface MyClass {
    NSString* _myProperty;
}
@property (nonatomic, retain) NSString* myProperty

- (NSString*)someOtherMethod;
@end

...

实现保持不变,并且工作原理相同。

您可以选择在实现中合成属性,这样您就可以删除_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];
}

这些示例中的每个示例在操作方式上都是相同的,属性语法只是简写,允许您编写较少的实际代码。

答案 1 :(得分:6)

return self.property - 会调用被覆盖的getter。

return _property; - 直接访问属性的实例变量,不调用getter。

return property; - 实例变量。

编辑:我应该强调,您将拥有两个不同的NSString变量 - property_property。我假设你在这里测试边界而不是提供实际的生产代码。

答案 2 :(得分:1)

上面的回答详细说明了所有的事情,我想再详细说明一下。

//旧方式

@interface MyClass {
    NSString* _myProperty; // instance variable
}
- (NSString*)myProperty; // getter method
- (void)setMyProperty:(NSString*)value;//setter method

@end

在此类之外无法看到实例变量,因为我们必须为它创建getter和setter。 后者在.m文件中合成它

但现在

我们只使用了

  @property(nonatomic) NSString *myProperty;

@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

现在转到.m文件

之前我们使用@synthesis合成了这个属性,现在它也不需要它由IDE自动完成。

little addition : this `@synthesis` now generate the getter and setter(if not readonly) methods.