我真的需要一些澄清 - 我有几个问题,我现在都搞砸了。
这是一个简单的类接口:
#import <UIKit/UIKit.h>
@interface Car : NSObject{
NSInteger carID;
NSString *carName;
}
@property (nonatomic, assign) NSInteger carID;
@property (nonatomic, copy) NSString * carName;
@end
carID
未被声明为指针?carID
的“assign”而不是“copy”?答案 0 :(得分:5)
NSInteger
只是原始类型的typedef(32位为int
,64位为long
) - 不对象,并且不能保留或复制。
类成员总是指针;你永远不会传递“真实”的物体;因此,充其量是无法管理的。
编辑:要扩展最后一段:Objective-C类实例始终存在于堆中,永远不会存在于堆栈中;这是为了方便引用计数和自我管理对象生命周期等事情。
这也意味着很难意外复制一个物体;但另一方面,意外处理您仍然需要的物体可能会更容易一些。尽管如此,后者更容易调试(因为它导致一个不错的,大的崩溃(最好,无论如何)),而不是最后一次(最糟糕的是导致缓慢的泄漏)。
答案 1 :(得分:1)
carID的属性并不正确。对于非指针的类型,正确的定义如下:
@property (nonatomic) NSInteger carID;
无论如何它总是会复制一个值,但是“copy”在属性中有一个非常不同的含义 - 对于在该属性用于设置新值时它将调用[object copy]的对象。
或者您可以放弃nonatomic
,但随后调用该物业的费用会更高(少量)。除非你有充分的理由不去,否则请留在非原子。
答案 2 :(得分:0)
谢谢你们!
所以在Objective-C中,你有int和Pointer Int。
您如何在目标C
中声明这些内容-int是一个普通的int。
-Pointer Int是整数的对象表示。由于它是一个对象,它也可以指向指针*。正确?
指针Int指针可以指向任何类型的指针如果我想。对? 如果它没有指向指针int,它将导致崩溃。但它会成功编译,对吧?
但是在什么情况下我更喜欢使用常规int来指向指针Int?
答案 3 :(得分:0)
我想补充说明你想要使用的原因:
@property (nonatomic, copy) NSString * carName;
而不是
@property (nonatomic, retain) NSString * carName;
copy关键字意味着您希望将NSString的COPY传递到当前对象引用中的语言语义。所以指针不会改变(这就是你不必释放对象ref的原因)。
retain关键字使得您获得将保留的指针,因为该数据成员的指针引用发生了更改(并且当前的一个将被释放)。复制NSString可能不是一个相当繁重的操作,因此经常使用复制NSString。您必须小心您声明为复制的属性类型。可能需要花费大量精力来制作像字典等类型的副本(参见浅层,深层复制等)。
希望有所帮助!