使用实例变量/属性/合成ARC的正确方法

时间:2013-03-13 11:47:00

标签: ios objective-c automatic-ref-counting synthesize

在ARC项目中工作时,使用实例变量(在接口上声明),@property@synthesize的正确方法是什么?我现在做的是:

SomeClass.h:

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

和SomeClass.m:

@implementation SomeClass

@synthesize someString;

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

问题是还有其他方法可行,比如只使用@property:

SomeClass.h:

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

在没有someString的情况下访问self

SomeClass.m:

@implementation SomeClass

@synthesize someString;

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

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

2 个答案:

答案 0 :(得分:9)

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

@interface SomeClass : NSObject

@property (nonatomic, copy) NSString *someString;

@end

实施:

@implementation SomeClass

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

@end

除非您使用-init方法或覆盖setter,否则请避免直接实例变量访问。在其他任何地方你都应该使用点语法(self.someString)。如果确实需要访问实例变量,则默认的syntize将创建一个以下划线为前缀的ivar,例如: _someString

请注意,对于具有NSString / NSMutableStringNSArray / NSMutableArray等可变版本的类,标准做法是使用copy属性。如果对字符串或数组使用strong,调用者可能会传入一个可变版本,然后从你下面改变它,导致难以发现的错误。

答案 1 :(得分:-2)

查看this SO post以获取有关ARC的信息。

Edited )“strong”属性告诉ARC保持一个对象,直到具有该属性的对象被释放。您确实需要“copy”属性,因为NSString属性可能已作为NSMutableString传入。 “副本”保证原始对象将被保留。再次,我为我最初在这里提供的错误/误导性信息道歉。

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