Objective-c自我和记忆

时间:2014-03-23 15:30:02

标签: ios objective-c

我有一些初次问题:

1)使用@propreties和@synthesize时,是否需要在dealloc方法中执行某些操作?或者没必要? (比如发布或其他东西)

2)我有类似的东西:

@property (copy, nonatomic) NSString *model; // On prend une copie pour le setter
@property (getter=getDistance, nonatomic) float odometer;

// constructeur doit toujours commencer par init
-(id)initWithModel:(NSString *)newModel {

    if(self = [super init]) {
        _model = [newModel copy];
        _odometer = 10.0;
    }

    return self;
}

我可以这样做:

self.model = [newModel copy];
self.odometer = 10.0;

这有什么区别?

3)为什么,对于NSString *,我们使用copy属性?

 @property(**copy**) && _variable = [newVariable **copy**] .. 

4)对于一个简单的应用程序(非多线程),我们可以使用非原子来获得最佳性能吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

  1. 是的,对于retaincopy属性,必须释放支持变量,或者必须在nil中将属性设置为-dealloc,除非您使用ARC。
  2. 您可以,但官方建议不要在-init方法中使用访问者。不同之处在于您的版本直接设置了支持变量,绕过了@synthesize d访问者的任何副作用(包括内存管理!)。但是,我应该指出,如果你不使用ARC,self.model = [newModel copy];会泄漏内存。如果您不使用ARC,请将其替换为self.model = [[newModel copy] autorelease];。这是两者之间差异的完美示例:_model = [newModel copy];没有泄漏。
  3. NSString有一个可变的子类,所以你不想retain传递给你的字符串,只是发现它后来发生了变异,你不知道!相反,请为自己制作一份副本,以确保它不会被外部物体搞砸。
  4. 绝对。无论如何,线程安全需要大于atomic