我看到它在为iOS编码时建议应该使用属性来访问实例变量,因为这会给内存管理带来诸多好处.
这个建议并不适合我.我发现使用属性而不是普通的旧ivars只需要太多的代码,如果你对内存管理感到满意,我并没有真正看到它的好处.它真的那么重要吗?您管理实例变量的方法是什么?
我现在从几个来源(stackoverflow.com,cocoa-dev,文档,博客等)中听到,在init和dealloc方法中使用访问器和设置(foo,setFoo :)是"错误的".据我所知,如果你这样做,很可能会混淆其他正在观察财产的物体.(这里给出一个简单的例子)
但是,由于以下原因,我不得不说我不同意这种做法:
新的Objective-C运行时(iPhone上的那个和10.5中的64位运行时)允许您在不声明相应的ivar的情况下声明属性.例如,以下类将在10.5或iPhone(设备,而不是模拟器)上编译得很好:
@interface Foo : NSObject { }
@property (retain) id someObject;
@end
@implementation Foo
@synthesize someObject;
@end
Run Code Online (Sandbox Code Playgroud)
理解上面是一个完全有效的Objective-C类,假设我决定编写一个初始化程序,并且出于内存管理的目的,使用dealloc方法(因为在iPhone上没有GC).我读过有关初始化器和释放器的所有内容都会让我编写以下两种方法:
- (id) init {
if (self = [super init]) {
//initialize the value of someObject to nil
[self setSomeObject:nil];
}
return self;
}
- (void) dealloc {
//setting someObject to nil will release the previous value
[self setSomeObject:nil];
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
但是,根据文件和流行的观点,这是"错误的".所以我的问题是这样的:
如果其中任何一个的答案是"你不能",那么在init和dealloc方法中使用访问器怎么可能不好?
我已经读过,@synthesize它将自动创建相应的实例变量,@property@protected默认情况下为 ivars .但是,如果我使用类扩展(如下所示)来指示@property方法是私有的呢?
// Photo.m
@interface Photo ()
@property (nonatomic, retain) NSMutableData *urlData;
@end
Run Code Online (Sandbox Code Playgroud)
相应的ivar会是@private吗?或者我应该明确地声明它是@private这样的吗?
// Photo.h
@interface Photo : Resource {
@private
NSMutableData *urlData;
}
Run Code Online (Sandbox Code Playgroud) 创建一个只读公开,读/写为"私有"的属性的最佳方法是什么?我可以创建一个readonly方法并在.m文件中的无名扩展名中声明该属性,但最好我想保留点符号.