objective-c - NSString(指针/非指针)分配或保留

标签 objective-c

我有同一类的四个变体。

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

使用每个案例的含义是什么?

1)

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

2)

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

3)

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

4)

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

最佳答案

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 的子类,您可能在赋值时被赋予了一个可变字符串,因此其他代码可能会在您不知情的情况下修改字符串的值(除非您使用 Key -Value Observing 观察那些变化)。出于这个原因,通常对您打算保存不可变值的属性(NSStringNSData)使用复制语义是合适的NSArrayNSSet 是常见的——尽管不是详尽的——嫌疑人)。

4)

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

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

关于objective-c - NSString(指针/非指针)分配或保留,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1362870/

相关文章:

ios - 可以将 iPhone 高高抛在空中启动我的应用程序或触发 iOS 7 或更高版本中的所需功能

objective-c - 在不传递 nil 的情况下迭代函数中可变数量的参数

ios - 自定义 UITableViewCell : programmatically trigger selection segue

ios - cocoa 代码-如何在 iPhone 的文档中查看创建的文件夹?

ios - 在 UITabBarItem 上使用自定义选择和未选择的图像

objective-c - 为什么最终二进制文件的大小会比静态库的大小小得多?

iphone - 如何访问类中的ABRecordRef值?

ios - Objective-C - 改变控件的外观实现外观 api

ios - UILabel 顶部对齐多行

objective-c - Objective-C 是否有类似于 StyleCop for .net 的工具?