6

在 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 仍然可以正常工作,例如,我不必担心内存泄漏)

4

2 回答 2

9

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

@interface SomeClass : NSObject

@property (nonatomic, copy) NSString *someString;

@end

和实施:

@implementation SomeClass

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

@end

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

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

于 2013-03-13T12:22:28.790 回答
-2

查看此 SO 帖子以获取有关 ARC 的信息。

(已编辑)“strong”属性告诉 ARC 保留一个对象,直到具有该属性的对象被释放。您确实需要“复制”属性,因为 NSString 属性可以作为 NSMutableString 传入。“副本”保证原始对象将被保留。再次,对于我最初在这里获得的不正确/误导性信息,我深表歉意。

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

于 2013-03-13T11:57:58.897 回答