2013-03-13 53 views
6

在ARC项目中工作时,使用实例变量(在接口上声明),它们的@property@synthesize的正确方法是什么?我现在做的是以下几点:在ARC中使用实例变量/属性/合成的正确方法

SomeClass.h:

@interface SomeClass : NSObject { 
    NSString *someString; 
} 
@property(nonatomic, copy) NSString* someString; 

和SomeClass.m:

@implementation SomeClass 

@synthesize someString; 

- (void)someMethod { 
    self.someString = @"Foobar"; 
} 

的事情是,有一些作品,如仅使用其他方法@属性:

SomeClass.h:

@interface SomeClass : NSObject 
@property(nonatomic, copy) NSString* someString; 

访问someStringself

SomeClass.m:

@implementation SomeClass 

@synthesize someString; 

- (void)someMethod { 
    someString = @"Foobar"; 
} 

等我是新来的Objective-C,我已经习惯了的Java。那么使用属性的正确方法是什么?我知道特殊情况会有特殊的行为,但一般情况下最好的办法是什么? (一般我的意思是我想从类本身和“外部”访问变量,我希望ARC仍然正常工作,例如,我不必担心内存泄漏)

+2

只需定义属性。如果你使用Xcode 4.5+,你甚至不需要合成语句。这被认为是正确的方式,因为属性会自动创建iVar。如果您需要使用iVar,那么如果在Xcode 4.5+中,在属性名称前面使用“_”(因为它们是自动创建的),如果不是,则创建它们,如下所示:@synthesize variable = _variable; – Petar 2013-03-13 11:59:02

+0

@ pe60t0实际上在Xcode 4.4中引入了不再需要使用'@ synthesize'语句的需求。 – 2013-03-13 12:08:32

+0

我的不好,现在无法编辑评论。 – Petar 2013-03-13 12:13:08

回答

9

对于简单的属性,您不需要实例变量声明或@synthesize。 clang编译器默认会为你生成。所以,你可以在标题写:

@interface SomeClass : NSObject 

@property (nonatomic, copy) NSString *someString; 

@end 

和实现:

@implementation SomeClass 

- (void)someMethod { 
    self.someString = @"Foobar"; 
} 

@end 

避免直接实例变量的访问,除非你是在-init方法或重写的制定者。其他地方你应该使用点语法(self.someString)。如果确实需要访问实例变量,默认合成将创建一个带下划线的前缀ivar,例如, _someString

注意,对于可变版本一样NSString/NSMutableStringNSArray/NSMutableArray类标准的做法是使用copy属性。如果你在字符串或数组上使用strong,调用者可能会传入一个可变的版本,然后在你的下面进行变异,导致很难找到的错误。

-2

检查出this SO post关于ARC的信息。

编辑)“strong”属性告诉ARC保留一个对象,直到具有该属性的对象被释放。您确实需要“copy”属性,因为NSString属性可能已经作为NSMutableString传入。 “复制”保证原始对象将被保留。再次,我为我原本在这里发现的错误/误导性信息表示歉意。

的原因,你可以访问实例变量someString还有财产self.someString是,@synthesize someString线的属性创建一个实例变量,并创建用于获取和设置它的价值的方法。但是,建议您使用属性而不是直接使用实例变量,因为通过使用实例变量,您不能让父对象知道您已更改其某个属性。

+0

请注意,由于Xcode 4.4如果没有明确使用'@ synthesize',那么实例变量将隐式命名为'_someString'并带有下划线。 – 2013-03-13 12:12:05

+1

在字符串中使用'strong'是错误的。在'NSString'或'NSArray'等东西中,调用者可以通过可变子类('NSMutableString'或'NSMutableArray'),然后在稍后对它进行变异,这是标准做法。 – 2013-03-13 12:18:46

相关问题