名为“a”的对象和名为“_a”的对象之间是否存在链接?

时间:2011-06-22 09:12:53

标签: objective-c ios

我是iOS新手所以请慢慢来。当我在名为“_a”的.h视图控制器中声明一个对象时,我声明了一个属性“a”,当我在.m文件中合成时

@synthesize a=_a;

当我修改该对象时,我必须使用“a”或“_a”吗? (在我的例子中,“a”是UINavigationController)。

在另一个问题中,我的编译器是否自动从声明为“ob”的对象到“_ob”声明绘制连接?

再次,对于糟糕的解释感到抱歉,但这种环境并不是我所习惯的。

2 个答案:

答案 0 :(得分:4)

声明如下的对象:

@interface Example : NSObject {
    NSObject *_a;
}
@property (retain) NSObject *a;
@end

并按照以下方式实施:

#import "Example.h"

@implementation Example
@synthesize a = _a;
@end

_a对象中创建名为Example的ivar和两个访问器方法。访问器方法具有以下签名:

- (NSObject *)a;
- (void)setA:(NSObject *)theA;

方法a返回_a ivar中的对象。方法setA释放存储在_a中的对象(如果不是nil),将参数分配给_a,并向参数发送retain消息。

这些方法也可以通过点表示法访问:

Example *e = [[Example alloc] init];
// These two are equivalent. 
e.a = anotherNSObject;
[e setA:anotherNSObject];
// These two are equivalent.
anotherNSObject = e.a;
anotherNSObject = [e a];

直接访问_a将绕过访问者方法,可能导致内存泄漏等问题。例如,如果_a保存对象的唯一引用,并且新对象引用分配给_a,则旧对象将成为泄漏对象。

直接回答你的两个问题:

您可以使用a_a。在大多数情况下,在设置_a的对象方法中的值时,最好使用a,并在设置时使用setA(或点符号为a_a的值。使用Example对象的对象应使用访问器方法(带或不带点表示法)。

编译器不会自动在ob_ob声明之间建立连接。在此示例中,@synthesize a = _a;语句与可选的= _a建立连接。伊娃可能有任何名字。 @synthesize a = george;也有效。如果没有= _a部分,编译器将生成名为a的ivar和两个访问器方法。

还有一点需要注意:您可以在界面中省略_a的声明,这会将_a ivar的范围限制为仅仅实现Example对象。将可选= _a添加到@synthesize语句将使ivar与接口中声明的属性的类型相同。

答案 1 :(得分:0)

@synthesize告诉编译器为您的属性生成setter和getter方法。您可以使用_a作为ivar或self.a作为属性,没有区别。 您还可以通过此属性

从另一个类设置类变量
[myClassInstance setA:newA];
oldA = [myClassInstance a]; //oldA = myClassInstance.a