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

Ond*_*cka 6 objective-c ios automatic-ref-counting synthesize

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

SomeClass.h:

@interface SomeClass : NSObject {
  NSString *someString;
}
@property(nonatomic, copy) NSString* someString;
Run Code Online (Sandbox Code Playgroud)

和SomeClass.m:

@implementation SomeClass

@synthesize someString;

- (void)someMethod {
  self.someString = @"Foobar";
}
Run Code Online (Sandbox Code Playgroud)

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

SomeClass.h:

@interface SomeClass : NSObject
@property(nonatomic, copy) NSString* someString;
Run Code Online (Sandbox Code Playgroud)

访问someString不包括self:

SomeClass.m:

@implementation SomeClass

@synthesize someString;

- (void)someMethod {
  someString = @"Foobar";
}
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*ler 9

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

@interface SomeClass : NSObject

@property (nonatomic, copy) NSString *someString;

@end
Run Code Online (Sandbox Code Playgroud)

并实施:

@implementation SomeClass

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

@end
Run Code Online (Sandbox Code Playgroud)

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

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