在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仍能正常工作,例如。我不必担心内存泄漏)
答案 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
/ NSMutableString
和NSArray
/ NSMutableArray
等可变版本的类,标准做法是使用copy
属性。如果对字符串或数组使用strong
,调用者可能会传入一个可变版本,然后从你下面改变它,导致难以发现的错误。
答案 1 :(得分:-2)
查看this SO post以获取有关ARC的信息。
( Edited )“strong”属性告诉ARC保持一个对象,直到具有该属性的对象被释放。您确实需要“copy”属性,因为NSString属性可能已作为NSMutableString传入。 “副本”保证原始对象将被保留。再次,我为我最初在这里提供的错误/误导性信息道歉。
您可以访问实例变量 someString
以及属性 self.someString
的原因是@synthesize someString
行创建了属性的实例变量,并创建用于获取和设置其值的方法。但是,建议您使用该属性而不是直接使用实例变量,因为通过使用实例变量,您不能让父对象知道您已更改其中一个属性。