【问题标题】:NSString (pointer/non pointer) assign or retainNSString(指针/非指针)分配或保留
【发布时间】:2010-11-24 16:10:45
【问题描述】:

我有同一个班级的四个变体。

指针、非指针、赋值与复制的混合。

使用每种情况的含义是什么?

1)

@接口水果:NSObject{ NSString 苹果; } @property(非原子,保留); @结尾

2)

@接口水果:NSObject{ NSString 苹果; } @property(非原子,分配); @结尾

3)

@接口水果:NSObject{ NSString *苹果; } @property(非原子,保留); @结尾

4)

@接口水果:NSObject{ NSString *苹果; } @property(非原子,分配); @结尾

【问题讨论】:

  • 另一个要考虑的选项是 (nonatomic, copy),它将(显然)复制字符串而不是保留或分配它。

标签: objective-c


【解决方案1】:

1)

@interface fruit:NSObject{
NSString apple;
}
@property(nonatomic, retain);
@end

您不能在堆栈上或作为对象实例变量分配NSObjects。在早期,Objective-C 确实允许这样做,但现在不再允许了。此代码不正确。

2)

@interface fruit:NSObject{
NSString apple;
}
@property(nonatomic, assign);
@end

您不能在堆栈上或作为对象实例变量分配NSObjects。在早期,Objective-C 确实允许这样做,但现在不再允许了。此代码不正确。

3)

@interface fruit:NSObject{
NSString *apple;
}
@property(nonatomic, retain);
@end

您保留了NSString 实例的所有权,保证在您保留该所有权时它不会被解除分配。由于NSMutableStringNSString 的子类,因此您可能在赋值时获得了一个可变字符串,因此其他代码可能会在您不知情的情况下修改字符串的值(除非您使用键值观察来观察这些更改)。出于这个原因,通常适合对打算保存不可变值的属性使用 copy 语义(NSStringNSDataNSArrayNSSet 是常见的——虽然不是详尽的——嫌疑人)。

4)

@interface fruit:NSObject{
NSString *apple;
}
@property(nonatomic, assign);
@end

保留该字符串的所有权权益,这意味着它可能在您不知情的情况下被解除分配。在引用计数环境中,这是委托属性的标准做法,因为保留它们可能会创建一个保留周期。负责解除分配字符串的代码必须在执行此操作之前将您的 apple 属性设置为 nil(在引用计数环境中)。在 GC 环境中,如果你有一个 __strong 指针,你的赋值将使字符串保持活动状态,或者如果你的声明中有一个 __weak 指针,则给你一个归零(在 dealloc 时设置为 0)。

【讨论】:

  • 非常感谢,“您不能在堆栈上分配 NSObjects”是什么意思?堆栈意味着内存中的一个特殊位置?因为我传递了一个非指针
【解决方案2】:

据我所知,您应该始终使用带有 NSString* 的保留或复制。分配指针 (4) 不会增加引用计数,因此会泄漏内存,或者更确切地说,这意味着您最终会访问已释放的内存,因为计数会过早地达到 0。

我不知道您是否可以将 NSString 用作本机类型。我总是用它作为指针。

【讨论】:

  • NSString 是一个对象,但只是想知道是否可以在其上使用 assign ,即使它是不可取的。是的,内存泄漏是有道理的。
  • Objective-C 中没有非指针对象变量这样的东西。试着用一个编译一个程序,它会让你知道。
猜你喜欢
  • 2014-01-10
  • 2014-05-13
  • 1970-01-01
  • 2016-03-03
  • 2015-03-20
  • 2013-12-10
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
相关资源
最近更新 更多