【问题标题】:Objective-c self and memoryObjective-c 自我与记忆
【发布时间】:2014-03-23 23:36:55
【问题描述】:

我有一些初次见面的问题:

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*,我们使用复制属性?

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

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

提前致谢

【问题讨论】:

  • 由于已经将模型属性设置为“copy”类型,所以不需要[newModel copy]。您可以直接执行 self.mode = newModel。您不必“必须”“复制”NSString。您这样做是因为通常您不需要在程序中不会更改的字符串的副本。为 NSString 选择保留副本实际上取决于程序如何工作。你应该阅读 Apple 的内存管理指南,因为它很好地解释了这一切。

标签: ios objective-c


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

【讨论】:

  • 就像我说的,我开始做objective-c --> a) ARC 是什么意思?我怎么知道我是否在使用它?
  • ARC 是“自动引用计数”,它为您管理内存。我认为知道你是否正在使用它的最可靠方法是尝试编写self.model = [[newModel copy] autorelease];,正如我上面所说的......如果编译器说“ARC 禁止显式发送'autorelease'的消息”,那么你正在使用ARC。 :) 如果没有,你需要阅读developer.apple.com/library/ios/documentation/Cocoa/Conceptual/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
  • 2011-08-29
  • 1970-01-01
相关资源
最近更新 更多