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 实例的所有权,保证在您保留该所有权时它不会被解除分配。由于NSMutableString 是NSString 的子类,因此您可能在赋值时获得了一个可变字符串,因此其他代码可能会在您不知情的情况下修改字符串的值(除非您使用键值观察来观察这些更改)。出于这个原因,通常适合对打算保存不可变值的属性使用 copy 语义(NSString、NSData、NSArray、NSSet 是常见的——虽然不是详尽的——嫌疑人)。
4)
@interface fruit:NSObject{
NSString *apple;
}
@property(nonatomic, assign);
@end
您不保留该字符串的所有权权益,这意味着它可能在您不知情的情况下被解除分配。在引用计数环境中,这是委托属性的标准做法,因为保留它们可能会创建一个保留周期。负责解除分配字符串的代码必须在执行此操作之前将您的 apple 属性设置为 nil(在引用计数环境中)。在 GC 环境中,如果你有一个 __strong 指针,你的赋值将使字符串保持活动状态,或者如果你的声明中有一个 __weak 指针,则给你一个归零(在 dealloc 时设置为 0)。