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仍能正常工作,例如.我不必担心内存泄漏)
对于简单属性,您不需要实例变量声明或@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/ NSMutableString和NSArray/ 等可变版本的类NSMutableArray,标准做法是使用copy属性.如果你strong在字符串或数组上使用,调用者可能传入一个可变版本,然后从你下面改变它,导致难以发现的错误.