gpt4 book ai didi

iphone - 关于 iPhone 上的 ivars 和 @property 的问题

转载 作者:行者123 更新时间:2023-12-03 16:53:22 24 4
gpt4 key购买 nike

我有一个关于实例变量如何工作以及何时使用@property的问题。这是我正在使用的示例接口(interface)文件

@interface PackageModel : NSObject {
NSString *tracking;
NSString *carrier;
NSString *status;
NSMutableDictionary *events;

// Connection ivars
NSMutableData *receivedData;

// Parsing ivars
int tagLevel;
NSMutableArray *tagTree;
NSString *parentTag;
NSString *currentTag;
}

@property (nonatomic, retain) NSMutableData *receivedData;

- (id)initWithTrackingString:(NSString *)string;
- (void)getPackageDataWithEvents;
- (void)printMe;

@end

如何在文件代码中访问这些内容。我可以通过使用类似的方法来访问此类方法中的跟踪、运营商和状态吗?

tracking = [[NSString alloc] initWithString:@"Hello World"];

另外,dealloc 中需要放入哪些变量?只有@property/@synthesize 中的变量?或者我需要在dealloc方法中释放所有实例变量。

我只是在寻找有关实例变量在 Objective-C 中如何工作的一些说明。谢谢。

最佳答案

@property 声明只不过是编译器生成的 getter 和 setter 方法。就是这样。只是方法而已。显然,您必须获取和设置某些东西,因此我们创建了与 getter 和 setter 一起使用的 ivar。在上面的示例中,您的编译器正在生成:

- (NSMutableData *) receivedData;
- (void) setReceivedData:(NSMutableData *)newReceivedData;

getter 返回 receivedData 实例变量中的值,setter 更改 receivedData 实例变量中的值。

(旁注:使用 64 位运行时,您可以跳过声明实例变量,但我仍然喜欢将其放入只是为了明确)

至于你应该在dealloc方法中做什么,你需要释放已经被retained或copyed的实例变量。因此,在您的示例中,您需要在 dealloc 方法中执行 [receivedData release]; ,因为当您设置 receivedData ivar 时,您保留了新值(这就是 @property 行中的 retain 的含义)。如果您在 @property 声明中未指定 retaincopy,则默认为 assign,您无需执行任何操作。除此之外,您还需要释放您自己保留的任何其他实例变量(即,不是通过 @property (retain) setter)。

对于你的最后一个问题,是的,你可以这样做:

tracking = [[NSString alloc] initWithFormat:@"Hello, %@!", @"world"];

在您自己的类中,您可以直接访问您自己的所有实例变量(以及您的父类(super class)的任何 protected 和公共(public) ivars)。

关于iphone - 关于 iPhone 上的 ivars 和 @property 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2173557/

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