gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:09:02 26 4
gpt4 key购买 nike

我是 iOS 开发的新手,在理解某些情况时遇到困难。我的问题是我是否同时需要变量和属性?

例如我看到这样的代码:

#import <Cocoa/Cocoa.h>

@interface Photo : NSObject {
NSString* caption;
NSString* photographer;
}
@property (retain) NSString* caption;
@property (retain) NSString* photographer;

@end

但是,据我所知,如果我删除变量 captionphotographer 代码仍然有效:

#import <Cocoa/Cocoa.h>

@interface Photo : NSObject

@property (retain) NSString* caption;
@property (retain) NSString* photographer;

@end

那么,请解释一下使用第一个和第二个的区别。

谢谢你的建议!

最佳答案

{} 括号内的变量是实例变量。它们仅供类(class)访问。

@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 = @"字符串"可能不是等效的调用字符串 = @"字符串"

如果你有@property (strong) NSString *string;和@synthesize字符串;这样做的原因是通过 self.string 设置字符串是使用方法实现来设置字符串,并且可以像这样被覆盖:

-(void)setString:(NSString *)str{
string = [NSString stringWithFormat:@"%@.jpg", str];
}

所以 self.string = @"hello"将是 @"hello.jpg"其中 string = @"hello"只是 "hello"

还有 self.string = @"string";与 [self setString:@"string"] 非常相似;

澄清@property(strong)NSString *string 的作用在 .h 中添加:

{
NSString *_string;
}
-(void)setString:(NSString *)string;
-(NSString *)string;

.m 内部:

-(void)setString:(NSString *)string{
_string = string;
}

-(NSString *)string{
return _string;
}

所以没有必要调用@synthesize 除非你想将 iVar 重命名为其他名称@synthesize string = wibblyWobblyTimeyWimey;

所以在 .h 中会是

{
NSString *wibblyWobblyTimeyWimey;
}

.m 里面

-(void)setString:(NSString *)string{
wibblyWobblyTimeyWimey = string;
}

-(NSString *)string {
return wibblyWobblyTimeyWimey;
}

关于ios - 我是否同时需要变量和属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18558147/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com