0

我意识到它会自动为您创建一个 setter 和 getter,但我不确定 setter 的实际“外观”如何。

另外,为什么建议我们说@synthesize someObject = _someObject;而不是 just @synthesize someObject;

4

2 回答 2

7

首先简单一点:你不再需要@synthesize了。如果你有一个@property并且你没有综合它,那么它是隐含的,形式为@synthesize someObject = _someObject;。如果你离开了,= _someObject那么你将拥有与 相同的东西@synthesize someObject = someObject;。因此,下划线版本是首选,因为 Apple 已经转而支持实例变量使用下划线,并且它与隐式综合类型一致。

setter 和 getter 的确切形式将取决于atomic, strong, unsafe_unretained, 等标志,但示例非原子强 setter,pre-ARC 是:

- (void)setProperty:(NSString *)newPropertyValue
{
    [newPropertyValue retain];
    [_property release];
    _property = newPropertyValue;
}

请注意,保留始终发生在发布之前。否则如下(你会以迂回的方式到达,而不是直接写):

self.property = _property;

可能会导致_property在保留之前被释放。

示例吸气剂(也是 ARC 之前的)是:

- (NSString *)property
{
    return [[property retain] autorelease];
}

retain确保即使从中查询的对象被释放,返回值也将保持不变。这autorelease确保您返回一个非拥有的引用(即,接收者不必明确地处理该事物,它可以在完成时忘记它)。如果返回的东西是不可变的,但实例变量是可变的,那么它是正确的形式,copy而不是保留,以确保您返回的内容在其他人持有它时不会发生变异。

于 2013-07-25T02:05:27.557 回答
2

查看 iPad 和iPhone 应用程序 itunes的第 3 章

_someObj替换存储对象的内存位置(指针)。Xcode 4 auto @synthesize anyObject = _anyObject;-> 所以你不需要再写@synthesize了。

如果您之前在.m 文件中写入了其他对象或 _anyMemoryLocation,如果您不想在.m 文件中重写所有名称,则可以使用 @synthesize yourObj = _anyMemoryLocation。

Setter 和 getter 2 方法用于在类外部或内部设置或获取对象的值:

-(void)setObject:(ObjectType *) object;
-(void)getObject:(ObjectType *) object;

关键的非原子自动为您生成 setter 和 getter。

如果你想实现更多的方法去setObject,你可以在你的.m文件中重写它

-(void)setObject:(ObjectType *) object{
    _object = object; //rewrite setter can done anywhere in your.m file
    //Add more method
}
于 2013-07-25T02:26:35.850 回答