带有指针的属性与objective-c中的属性之间的差异

Posted

技术标签:

【中文标题】带有指针的属性与objective-c中的属性之间的差异【英文标题】:Differences between properties with pointer and not in objective-c 【发布时间】:2010-11-13 17:58:59 【问题描述】:

我正在参加itunesU上的ios开发课程(来自斯坦福大学)。 我对在其中一堂课中创建的类的属性有很大的疑问。让我用一些代码解释一下:

我有一个“faceView”类,它的任务是绘制一张脸,该类的一个属性是“delegate”,它是一个必须实现 FaceViewDelegate 的对象。

接口代码如下:

#import <UIKit/UIKit.h>
@class FaceView;

@protocol FaceViewDelegate
-(float)smileForFaceView:(FaceView *)requestor;
@end

@interface FaceView : UIView 
    id <FaceViewDelegate> delegate;
    CGFloat scale;


@property CGFloat scale;
@property (assign) id <FaceViewDelegate> delegate;

@end

我不明白为什么委托不是指向对象的指针,而是直接的对象。 有人可以告诉我更多关于这个实现选择的信息吗?它是否正确 ?为什么 ? 非常感谢!

【问题讨论】:

【参考方案1】:

它是一个指向对象的指针。 id 类型已经是一个指针。所以当你声明id 类型的变量时,它们不需要是指针。因此,这些语句本质上是相同的(意味着您可以以完全相同的方式使用 myIDObj 和 myObj):

// myIDObj and myObj are both pointers to objects
id myIDObj = [[NSObject alloc] init];
NSObject* myObj = [[NSObject alloc] init];

【讨论】:

我可以补充一下,通常最好使用id 代替NSObject*,某些类可能不会从NSObject 继承,而且NSObject* 除了它的那些之外,不会预期任何其他消息实现(虽然它有效,但编译器会给出警告),其中id 只是一个未知对象,可以接收原始对象可以接收的任何消息。 @Adam Ko:我并不是建议使用 NSObject 代替 id 随机对象,只是证明它已经是一个指针,并且一旦声明了变量,它们的使用方式相同。 【参考方案2】:

delegate 一个指向对象的指针。 id 类型定义为:

typedef struct objc_object 
    Class isa;
 *id;

所以它已经是一个指针了。

【讨论】:

以上是关于带有指针的属性与objective-c中的属性之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

在 Objective-C 中的类属性上使用单词“set”

Objective-C中的原子属性与线程安全

Objective-C——属性与成员变量辨析

OS 2.2.1 和 OS 3 之间的 Objective-C 变化?

Objective-C中@property的所有属性详解

Objective-C中@property的所有属性详解