我是iOS新手所以请慢慢来。当我在名为“_a”的.h视图控制器中声明一个对象时,我声明了一个属性“a”,当我在.m文件中合成时
@synthesize a=_a;
当我修改该对象时,我必须使用“a”或“_a”吗? (在我的例子中,“a”是UINavigationController)。
在另一个问题中,我的编译器是否自动从声明为“ob”的对象到“_ob”声明绘制连接?
再次,对于糟糕的解释感到抱歉,但这种环境并不是我所习惯的。
答案 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