合成的目的

时间:2013-02-02 02:56:10

标签: ios objective-c

我正在使用iOS5书来学习iOS编程。

@synthesize coolWord;

^ synthesize用于.m文件中的所有属性

我听说在iOS6中不需要合成,因为它是自动完成的。这是真的吗?

合成是否对iOS6起任何作用?

感谢您的澄清。 :)

6 个答案:

答案 0 :(得分:34)

在objective-c中的@synthesize只实现属性设置器和getter:

- (void)setCoolWord:(NSString *)coolWord {
     _coolWord = coolWord;
}

- (NSString *)coolWord {
    return _coolWord;
}

Xcode 4确实为您实现了这一点(iOS6需要Xcode 4)。从技术上讲,它实现了@synthesize coolWord = _coolWord_coolWord是实例变量,coolWord是属性。)

要访问这些属性,请使用self.coolWord设置self.coolWord = @"YEAH!";和获取NSLog(@"%@", self.coolWord);

另请注意,setter和getter仍然可以手动实现。如果你同时实现了setter和getter,你还需要手动包含@synthesize coolWord = _coolWord;(不知道为什么会这样)。

答案 1 :(得分:9)

iOS6中的自动合成仍然需要@synthesize

  • @protocol
  • 中定义的属性生成存取方法
  • 在您包含自己的访问者时生成支持变量。

第二种情况可以这样验证:

#import <Foundation/Foundation.h>
@interface User : NSObject
@property (nonatomic, assign) NSInteger edad;
@end
@implementation User
@end

键入:clang -rewrite-objc main.m并检查是否生成了变量。现在添加访问者:

@implementation User
-(void)setEdad:(NSInteger)nuevaEdad {}
-(NSInteger)edad { return 0;}
@end

键入:clang -rewrite-objc main.m并检查是否未生成变量。因此,为了使用访问器中的支持变量,您需要包含@synthesize

可能与this

有关
  

Clang为声明属性的自动合成提供支持。运用   这个功能,clang提供了那些属性的默认合成   声明@dynamic并没有用户提供的支持getter和   setter方法。

答案 2 :(得分:4)

我不确定@synthesize与iOS6的关系,但自Xcode 4.0以来,它基本上已被弃用。基本上,你不需要它!只需使用@property声明和幕后,编译器就会为您生成它。

以下是一个例子:

@property (strong, nonatomic) NSString *name;

/*Code generated in background, doesn't actually appear in your application*/
@synthesize name = _name;

- (NSString*)name
{
    return _name;
}

- (void) setName:(NSString*)name
{
    _name = name;
}

所有代码都会为您处理编译器。因此,如果您的应用程序具有@synthesize,则需要进行一些清理。

您可以查看我可能有助于澄清的类似问题here

答案 3 :(得分:2)

我相信@synthesize指令会自动插入到最新的Obj-C编译器(iOS 6附带的编译器)中。

iOS 6之前@synthesize的重点是自动创建getter&amp;实例变量的setter,以便生成[classInstance getCoolWord][classInstance setCoolWord:(NSString *)aCoolWord]。因为它们是用@property声明的,所以你也可以获得getter和setter的点语法的便利。

答案 4 :(得分:1)

hope this will help little more

yes previously we have to synthesis the property by using @synthesis now it done by IDE itself.

但我们可以像

一样使用它

//内部IDE做什么

@synthesis name=_name;

我们使用_name来访问特定属性,但现在你想通过其他方式进行综合 名字你可以像

那样做
@synthesis name= firstname

或仅按名称

@synthesis name=name

答案 5 :(得分:0)

在iOS6中使用自动合成,不再需要专门声明支持ivars或编写@synthesize语句。当编译器找到@property语句时,它将使用我们刚刚审查的指南代表我们做这两种情况。所以我们需要做的就是声明一个这样的属性:

@property (nonatomic, strong) NSString *abc;  

在iOS 6中,@ synthesize abc = _abc将在编译时自动添加。