Objective-C类中的指针,基元和属性

时间:2009-07-14 19:23:50

标签: objective-c pointers properties primitive-types

我真的需要一些澄清 - 我有几个问题,我现在都搞砸了。

这是一个简单的类接口:

#import <UIKit/UIKit.h>

@interface Car : NSObject{
    NSInteger carID;
    NSString *carName;
}

@property (nonatomic, assign) NSInteger carID;
@property (nonatomic, copy) NSString * carName;
@end
  1. 为什么carID未被声明为指针?
  2. 为什么它使用carID的“assign”而不是“copy”?
  3. 为什么甚至首先将类成员声明为指针? (在我的主程序中,我的Car对象将用作指针。)

4 个答案:

答案 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。您必须小心您声明为复制的属性类型。可能需要花费大量精力来制作像字典等类型的副本(参见浅层,深层复制等)。

希望有所帮助!