我是iOS开发的新手,在理解某些情况时遇到了麻烦。 我的问题是我是否同时需要变量和属性?
例如,我看到了这样的代码:
#import <Cocoa/Cocoa.h>
@interface Photo : NSObject {
NSString* caption;
NSString* photographer;
}
@property (retain) NSString* caption;
@property (retain) NSString* photographer;
@end
但是,据我所知,如果我删除变量标题和摄影师代码仍然有效:
#import <Cocoa/Cocoa.h>
@interface Photo : NSObject
@property (retain) NSString* caption;
@property (retain) NSString* photographer;
@end
所以,请解释使用第一个和第二个的区别。
谢谢,任何建议!
答案 0 :(得分:2)
{}括号内的变量是实例变量。他们只能在课堂上访问。
@property定义了(选项)表示的一些不同的东西。
大多数人使用@property来处理.m和.h文件中的便捷方法。例如
@property (strong) NSString *string;
在.h和.m文件中创建两个方法,虽然这些方法不可见,但是名为:
-(NSString *)string; //returns the string object
-(void)setString:(NSString *)string;
所以它的作用是提高可读性,并有助于减少大量锅炉板代码。
现在不再需要在{}括号内定义实例变量。
如果您需要将实例变量设置为其他名称,则可以输入
@synthesize string = _string;
因为你是这个人的新手,所以添加一些额外的东西供你思考。 self.string = @“string” 可能不是一个等效的电话 string = @“string”
如果你有@property(强)NSString * string;和@synthesize字符串; 这样做的原因是通过self.string设置字符串是使用方法实现来设置字符串,可以像这样重写:
-(void)setString:(NSString *)str{
string = [NSString stringWithFormat:@"%@.jpg", str];
}
所以self.string = @“hello”将是@“hello.jpg”,其中string = @“hello”只是“你好”
另外self.string = @“string”;与[self setString:@“string”];
大致相同有关@property(强)NSString *字符串的说明 在.h内添加:
{
NSString *_string;
}
-(void)setString:(NSString *)string;
-(NSString *)string;
里面.m:
-(void)setString:(NSString *)string{
_string = string;
}
-(NSString *)string{
return _string;
}
因此除非您想将iVar重命名为其他内容,否则无需调用@synthesize @synthesize string = wibblyWobblyTimeyWimey;
所以在.h中就是
{
NSString *wibblyWobblyTimeyWimey;
}
<。>在.m 内
-(void)setString:(NSString *)string{
wibblyWobblyTimeyWimey = string;
}
-(NSString *)string {
return wibblyWobblyTimeyWimey;
}
答案 1 :(得分:1)
如果您使用的是Xcode 4.6.x,并且已经安装了Clang 4或更高版本的命令行工具,则可以利用“自动合成”属性。
@interface Photo : NSObject
@property (retain) NSString* caption;
@property (retain) NSString* photographer;
@end
将为您提供实例变量_caption和_photographer。所以不,在大多数情况下,你真的不需要声明实例变量。如果你正在使用ARC,那么只有使用属性才有意义。
如果您使用ARC,那么代码应该是什么样子:
@interface Photo : NSObject
@property (strong) NSString* caption;
@property (strong) NSString* photographer;
@end
此外,通常最好指定nonatomic
属性。不这样做意味着clang将生成的访问器将使用锁:
@interface Photo : NSObject
@property (strong, nonatomic) NSString* caption;
@property (strong, nonatomic) NSString* photographer;
@end
答案 2 :(得分:0)
不,不。 {}
中的变量是私有成员,继承此头文件的类无法访问,而properties
可以通过继承类来访问,读取和写入。
但事实并非如此。在某些情况下(如delegates
),两者都是必需的。