带有指针的属性与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中的属性之间的差异的主要内容,如果未能解决你的问题,请参考以下文章