Objective-C类中的指针、原语和属性

Objective-C类中的指针、原语和属性,objective-c,pointers,properties,primitive-types,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 #导入 @接

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

下面是一个简单的类接口:

#import <UIKit/UIKit.h>

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

@property (nonatomic, assign) NSInteger carID;
@property (nonatomic, copy) NSString * carName;
@end
#导入
@接口车:NSObject{
卡氏囊尾蚴;
NSString*卡纳姆;
}
@属性(非原子,分配)NSInteger carID;
@属性(非原子,副本)NSString*carName;
@结束
  • 为什么
    carID
    没有声明为指针
  • 为什么它对
    carID
    使用“分配”而不是“复制”
  • 为什么要首先将类成员声明为指针?(在我的主程序中,我的Car对象将用作指针。)

  • NSInteger
    只是一个基本类型的typedef(32位为
    int
    ,64位为
    long
    )——它不是一个对象,因此不能被保留或复制

    类成员总是指针;你永远不会传递“真实”的物体;这充其量是无法管理的

    编辑:展开最后一段:Objective-C类实例始终存在于堆上,而不是堆栈上;这是为了简化引用计数和自管理对象生命周期之类的工作


    这也意味着很难意外地复制一个对象;但从另一方面来说,意外处置你仍然需要的物品会更容易一些。尽管如此,后者比上一个更容易调试(因为它会导致一个很好的大崩溃(最好是这样),而上一个则会导致缓慢的泄漏)。

    carID的属性实际上并不正确。对于不是指针的类型,正确的定义如下所示:

    @property (nonatomic) NSInteger carID;
    
    不管怎样,它总是要复制一个值,但是“复制”在属性中有一个非常不同的含义——对于对象,当该属性用于设置新值时,它将调用[object copy]

    或者您可以放弃
    非原子属性
    ,但是调用该属性的成本更高(只需少量)。除非你们有充分的理由不这样做,否则就在非原子舱里离开。

    谢谢大家

    在Objective-C中,有int和指针int

    你如何在目标C中声明这些

    -int是正则int

    -指针Int是整数的对象表示形式。因为它是一个对象,所以它也可以指向指针*。对吧?

    如果我愿意,指针Int指针可以指向任何类型的指针。对吗? 如果它不指向指针int,它将导致崩溃。但它将成功编译,对吗


    但是,在什么情况下,我更喜欢使用常规int而不是指针int?

    我想补充一些说明,说明为什么要使用:

    @property (nonatomic, copy) NSString * carName;
    
    而不是

    @property (nonatomic, retain) NSString * carName;
    
    copy关键字表示希望将NSString的副本传递到当前对象引用中的语言语义。因此指针不会改变(这就是为什么不必释放object ref)


    retain关键字可以使您获得将被保留的指针,因为该数据成员的指针引用发生了更改(当前的指针引用将被释放)。复制NSString可能不是一个相当繁重的操作,因此经常使用复制NSString。您必须小心声明为副本的属性类型。可能需要花费大量的精力来制作字典等类型的副本(参见浅副本、深副本等)


    希望有帮助

    其他看起来像类的普通的旧数据类型:<代码> NSUInteger < /C>(未签名long),<代码> CGPoT < /C> >代码> CGRCTE< <代码>,<代码> NSRange < /C>(Stults),<代码> CGFloat < /Cube >(double)AOK,因为C++中可以有整数指针。但不在Objective C中。实际上,Objective-C中可以有整数指针,因为在C中可以。但是,当您希望其他函数/方法将原语值直接写入特定地址时,通常会使用指向原语的指针。当您使用Objective-C属性时,不需要这样做,因为您正在将提供的任何值复制到实例变量中。在本例中,“Pointer Int”可能是一个NSNumber对象。它将被声明为NSNumber*myInt。当然,要从中得到整数值,必须调用[MyIntValue]。如果您只需要一个计数器,那么您只需要一个基本整数。NSNumber的唯一原因是将其传递给需要对象的对象,例如NSArray或NSDictionary。“此数据成员的指针引用更改”-真的,为什么会更改?-我认为,一旦在堆中分配了内存对象,它就仍然存在?我的意思是,它现在指向其他对象,而不是它以前指向的对象!我只是想把我的想法绕到这个问题上来好的,非常感谢,12,有时候你想使用copy的原因是,你可以获得分配给变量的相同信息,而不必担心信息来自何处,被释放和丢失数据。副本将把日期的“副本”放在您控制的内存中。