我是否同时需要变量和属性?

时间:2013-09-01 11:52:56

标签: ios objective-c cocoa

我是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

所以,请解释使用第一个和第二个的区别。

谢谢,任何建议!

3 个答案:

答案 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),两者都是必需的。