2012-04-13 62 views
1

我已经花了几天的时间学习Objective-C并且有几个关于@property的问题。我有C#经验,了解需要指针,初始化等为什么我可以使用内联变量来声明@property?

因此,作为一个例子:

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

@property (retain, nonatomic) UIImageView *image 

@end 

@implementation MyClass 
     @synthesise image 
@end 

我明白@synthesise被用于创建@property。但是,我有几个问题,只是帮我收拾东西:

  1. 是否@property重复或取代我的原始定义,或者它仅仅是建立在原有的mutibility和原子?
  2. 是否@synthesise删除我的需要使用image = [[UIImageView alloc] init]
  3. 如果我没有提供@property,仍然继续创建并手动销毁我的变量,这是否有所作为?

最终,两者之间的区别在于,@property为您提供了关于内存管理和多线程的更多灵活性,正常的默认值给您提供了灵活性。

+2

@prototype不是Objective-C关键字。你的意思是@property? – zpasternack 2012-04-13 07:59:59

+0

你的意思是@property,right – willc2 2012-04-13 08:00:14

+0

对不起,在手机上打字。很快就会改变它。感谢您的发现。 – 2012-04-13 08:10:27

回答

3

@原型是复制还是替换我的原始定义,还是仅仅设置了原始的粘连性和原子性?

利用最新的编译器版本时image伊娃声明是多余的

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

的属性声明指定的类型,名称,存储(在最近的编译器发行),声明了存取方法(例如- (UIImageView *)image;- (void)setImage:(UIImageView *)pImage;),和其它属性说明符(当由编译器生成的访问器,其被使用) 。

是否@synthesise删除我的需要使用图像= [UIImageView alloc]?

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

如果我没有提供@property,仍然继续手动创建和销毁我的变量,这是否有任何区别?

这样可以,当你不想/需要为你生成的样板存取方法。这是一个设计选择。不是每个伊娃都需要访问者方法。

最终,2的区别在于,@property为内存管理和多线程提供了更多的灵活性,而正常的默认值给出了默认值。

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

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

原子性(在此上下文中)等同于正确的线程安全性和正确的并发执行是很少见的。

0

你可以这样做:

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

@implementation MyClass 
@synthesize image; 
@end 

是否@prototype重复或取代我的原始定义,或者它仅仅是建立在原有的mutibility和原子?

该属性添加的东西,像KVO和线程安全,如果它是原子的顶部。

是否@synthesise删除我的需要使用图像= [UIImageView alloc]?

没有

如果我不提供@property,仍然继续创建和手动摧毁我的变量,这是否有什么区别?

如果你没有创造财产,你会失去一个物业让你喜欢KVO的东西,这是一个关于如何使用变量的判断和API调用。在弧下,使用直线式ivars更容易,因为您不必复制保留并自动释放属性。

2

1)属性不会替换类成员。属性是一个声明,您希望访问器(获取器和设置器)类成员执行某些“自动”任务并具有某个名称。

例如:

@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你的变量,无论accessor综合。

3)编号属性/合成只需要a)便利性,无论是多线程的语法还是原子性,以及b)外部访问类中的成员。

编辑:
澄清关于多线程与性能,宣告nonatomic做线程安全的大量财产。这和我对#3的回应解决了你最后关心的问题。

0

@property中的'图像'(保留,非原子)UIImageView *图像行只是属性名称和IBOutlet UIImageView *图像;是通过self.image访问的ivar。我总是命名为财产伊娃一样的名字,但添加_:

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

如果你不会为你的财产Xcode的伊娃自动为您(伊娃的名字将是相同的作为财产的名称)

相关问题