strong/weak/retain/unsafe_unretained/assign

Pet*_*isu 36 cocoa objective-c

用于合成属性的属性: retain/assign

  • 保留 - 保留,旧值被释放并被分配
  • assign - 仅分配

所有权属性: IOS5 =强/弱IOS4 = retain/unsafe_unretained

  • 强大(iOS4 =保留) - 我是主人,你不能解除这个,然后瞄准罚款=保留

  • weak(iOS4 = unsafe_unretained) - 与assign,no retain或release相同

所以unsafe_unretained == assign?

@property (nonatomic, assign) NSArray * tmp;
Run Code Online (Sandbox Code Playgroud)

等于?

@property (nonatomic, unsafe_unretained) NSArray * tmp;
Run Code Online (Sandbox Code Playgroud)

反之亦然?

如果是这样,在iOS4中哪一个更喜欢,或者为什么(unsafe_unretained)如果它与assign完全相同?

并且iOS4中的委托应该是unsafe_unretained还是分配?

Mat*_*uch 47

如果是这样,在iOS4中哪一个更喜欢,或者为什么(unsafe_unretained)如果它与assign完全相同?

你应该使用unsafe_unretained.您希望向您的代码的读者显示您实际上想要使用的弱,但这是不可能的,因为在您要部署的iOS版本上没有弱.

有一天你会放弃对iOS4的支持.然后你可以用它来搜索unsafe_unretained和替换所有这些weak.这比搜索assign和弄清楚你是否真正意味着assign或更容易weak

使用unsafe_unretained创建更易读和易懂的代码,开发人员的意图更容易被看到.基本上我们使用的原因相同YES而不是1.

  • 代表应该有一个弱任务.但是由于iOS4上没有弱,你应该使用unsafe_unretained.我没有看到为任何非原始类型(NSInteger,float,...)使用`assign`的理由.在手动内存管理中,我们使用assign,因为没有更好的东西.但是弱更好,因为当对象被释放时,它将变量设置为nil. (14认同)
  • @MatthiasBauch一个"弱"而不是"unsafe_unretained"代表正是我所需要的!一些剩余的遗留代码仍然使用`unsafe_unretained`,并在执行委托方法时导致`Thread 1:EXC_BAD_ACCESS(code = 1,address = 0x ...)`错误.代表已被解除分配,但没有被剔除,所以它实际上通过我的零检查,并开始违背我的意愿执行选择:( (2认同)