1

第一篇文章。对不起,如果我搞砸了代码规则。我正在尝试从 Big Nerd Ranch Guide 中学习 Objective C。我将发布处理强引用的示例。

#import <Foundation/Foundation.h>

@interface Asset : NSObject
{
  NSSTRING *label;
  unsigned int resaleValue;
}
@property (strong) NSString *label;
@property unsigned int resaleValue;
@end

所以基本上 NSString 需要一个强引用,而 int 不需要。我知道 NSString 是一个对象,并且我读过如果没有指定任何变量,则为变量赋予 assign 属性。

因此,如果 assign 足以让 int 之类的东西在拥有它的对象被释放之前不被释放,那么为什么不能让 Asset 对象中的 NSString 对象不被释放呢?最终,我想我仍然对 assign 在引用计数方面的作用与 strong 的作用感到困惑(或者我应该说 retain ,因为这是在 ARC 中替换的 strong )。

4

1 回答 1

1

如果您来自 C++,则强 == 到 std::shared_ptr

strong 表示在分配期间必须分别保留和释放对象。

-(void)assign:(id) b to:(id) a {
    if( b ){
      [b retain];
    }
    if ( a ){
      [a release];
    }
    a = b;

}

要回答您的第二个问题,objective-C 对象的大小不像结构那样定义。因此 obj-C 类不能按值保存。

因此,编译为 obj-c 的 obj-c 类中的所有数据将始终在其中存储普通的旧数据类型,因为它们的大小可以确定为固定的。

考虑一个 8 字节的缓冲区;

前 4 个字节用于您的 int,后 4 个字节是您的指针,因为具有可变长度的字符串会在运行时更改对象的大小,您会看到这不起作用,在堆上分配一个字符串并分配到你的指针。

于 2012-04-24T05:16:39.320 回答