我有同一类的四种变体。
指针,非指针,分配与复制的混合。
使用每个案例有什么含义?
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
答案 0 :(得分:9)
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
,{{1} },NSArray
是常见的 - 尽管不是豁免 - 嫌疑人。)
4)
NSSet
您不保留字符串中的所有者权益,这意味着它可能会在没有您的知识的情况下解除分配。在引用计数环境中,这是委托属性的标准做法,因为保留它们可能会创建保留周期。负责取消分配字符串的代码必须在执行此操作之前将apple属性设置为nil(在重新计算的环境中)。在GC环境中,如果你有一个__strong指针或者如果你的声明中有__weak指针那么给你一个归零(在dealloc设置为0),你的赋值将使字符串保持活动状态。
答案 1 :(得分:2)
据我所知,您应该始终使用保留或复制NSString *。分配指针(4)不会增加引用计数,因此会泄漏内存,或者更确切地说,这意味着您最终会访问已释放的内存,因为计数会过早地达到0。
我不知道您是否可以将NSString用作本机类型。我总是用它作为指针。