1

我花了几天时间学习 Objective-C 并且有一些关于@property. 我有 C# 的经验,所以了解指针、初始化等的需求。

举个例子:

 @interface MyClass : NSObject
 {
      IBOutlet UIImageView *image;
 }

 @property (retain, nonatomic) UIImageView *image

 @end

 @implementation MyClass
      @synthesise image
 @end

我知道这@synthesise是用来创建@property. 但我有几个问题只是为了帮助我弄清楚:

  1. 是否@property重复或替换了我原来的定义,或者它只是建立了原始定义的可变性和原子性?
  2. 是否@synthesise消除了我使用的需要image = [[UIImageView alloc] init]
  3. 如果我不提供 a@property并且仍然继续手动创建和销毁我的变量,那有什么区别吗?

最终,两者之间的区别在于,@property 在内存管理和多线程方面为您提供了更大的灵活性,而普通的则为您提供了默认值。

4

4 回答 4

3

@prototype 是否重复或替换了我的原始定义,或者它只是设置了原始定义的可变性和原子性?

使用最新的编译器版本时,ivar 声明image是多余的。

前者声明了一个 ivar(类型 + 名称 + 实例存储)。

属性声明指定类型、名称、存储(在最近的编译器版本中)、声明访问器方法(例如- (UIImageView *)image;- (void)setImage:(UIImageView *)pImage;)和其他属性说明符(在编译器生成访问器时使用)。

@synthesise 是否消除了我使用 image = [UIImageView alloc] 的需要?

不,您仍然需要dealloc适当地实现您的初始化程序和(在 MRC 中)。

如果我不提供@property 并且仍然继续手动创建和销毁我的变量,那有什么区别吗?

这很好,当您不希望/不需要为您生成样板访问器方法时。这是一个设计选择。并非每个 ivar 都需要访问器方法。

最终,两者之间的区别在于,@property 在内存管理和多线程方面为您提供了更大的灵活性,而普通的则为您提供了默认值。

它们存在的最大原因是方便。属性节省了大量的样板代码。

属性没有更多的灵活性——属性实现了最实际的用途。

原子性(在这种情况下)很少等同于适当的线程安全和正确的并发执行。

于 2012-04-13T08:45:27.323 回答
2

1)该属性不替换类成员。属性是您希望类成员的访问器(getter 和 setter)执行某些“自动”任务并具有特定名称的声明。

例如:

@interface MyClass : NSObject
{
    NSInteger __myInt;
}
@property (assign) NSInteger myInt;
@end

@implementation MyClass
    @synthesize myInt=__myInt;
@end

出于所有意图和目的,上述代码导致在编译时自动生成以下方法:

-(NSInteger) myInt
{
    return self->__myInt;
}
-(void) setmyInt:(NSInteger)val_
{
    self->__myInt = val_;
}

当然,当 Xcode 编译你的程序时“在后台”发生的事情有点不同,而且更细微,但这基本上就是发生的事情。

2)我不完全清楚你的意思是什么......你总是需要allocinit你的变量,无论访问器合成如何。

3) 不需要。属性/综合只是为了 a) 方便,无论是多线程的语法还是原子性,以及 b) 对类内成员的外部访问。

编辑:
为了澄清多线程和属性,声明属性nonatomic对线程安全有很大帮助。这,以及我对#3 的回复,解决了您对问题的最后一个担忧。

于 2012-04-13T08:10:17.113 回答
0

你可以这样做:

 @interface MyClass : NSObject
 @property (retain, nonatomic) IBOutlet UIImageView *image;
 @end

 @implementation MyClass
 @synthesize image;
 @end

@prototype 是否重复或替换了我的原始定义,或者它只是设置了原始定义的可变性和原子性?

该属性在 ivar 之上添加了一些东西,比如 KVO 和线程安全(如果它是原子的)。

@synthesise 是否消除了我使用 image = [UIImageView alloc] 的需要?

如果我不提供@property 并且仍然继续手动创建和销毁我的变量,那有什么区别吗?

如果你不创建一个属性,你就会失去一个属性让你喜欢 KVO 的东西,这是对如何使用变量的判断和 api 调用。在 arc 下,直接使用 ivar 要容易得多,因为您不必复制自动执行的保留和释放属性。

于 2012-04-13T07:56:10.557 回答
0

@property (retain, nonatomic) UIImageView *image 行中的“图像”只是属性和 IBOutlet UIImageView *image 的名称;是您通过 self.image 访问的 ivar。我总是为与名称相同的属性命名一个 ivar,但添加 _ :

UIImage * image_;
@property (retain, nonatomic) UIImageView *image;
@synthesize image = image_;

如果您不为您的属性创建 ivar,Xcode 会自动为您创建(ivar 的名称将与属性的名称相同)

于 2012-04-13T08:39:22.970 回答