我正在使用iOS5书来学习iOS编程。
@synthesize coolWord;
^ synthesize用于.m文件中的所有属性
我听说在iOS6中不需要合成,因为它是自动完成的。这是真的吗?
合成是否对iOS6起任何作用?
感谢您的澄清。 :)
答案 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将在编译时自动添加。