我试图弄清楚将 myString 合成到实例变量 _myString 的目的是什么。
这样做的目的是什么?我倾向于注意到很多人这样做。
我也应该释放实例变量并将实例变量设置为nil,对吗?
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
{
NSString *_myString;
}
@property (nonatomic, retain) NSString *myString;
@end
ViewController.m
#import "ViewController.h"
@implementation ViewController
@synthesize myString = _myString;
- (void)viewDidLoad
{
[super viewDidLoad];
self.myString = [[NSString alloc] initWithFormat"Hello"];
_myString = [[NSString alloc] initWithFormat"Goodbye"];
NSLog(@"%@\t%@", self.myString, _myString);
}
- (void)viewDidUnload
{
_myString = nil;
[super viewDidUnload];
}
- (void)dealloc
{
[_myString release];
[super dealloc];
}
@end
当您在 objective-c 中 @synthesize 对象类型属性时,编译器将为该实例变量生成两个隐藏方法。这样当你引用myObject.myString
时,不仅会返回_myString的指针,还会调用生成的- (NSString*) myString
方法。同样,如果你给属性赋值: myObject.myString = @"foo";
它将被编译成 [myObject setMyString"foo"];
。 p>
- (NSString*) myString
和 - (void) setMyStringNSString*) theString
中的内容取决于您在声明属性时指定的关键字。最常见的是assign
,它简单地分配你给的指针:
- (void) setMyStringNSString*) theString
{
_myString = theString;
}
- (NSString*) myString
{
return _myString;
}
这与将 _myString 声明为公共(public)变量没有太大区别,但更明确的说法是可以从外部直接访问此变量。
retain
依次生成类似的setter方法(getter方法也一样):
- (void) setMyStringNSString*) theString
{
[theString retain];
[_myString release];
_myString = theString;
}
您可以看到,这会处理您传递给属性的对象的内存管理。换句话说,您可以确保该对象在您拥有它之前不会被释放,因此您不必在获得它的所有权时手动retain
它。这使得编写管理内存而不会泄漏的代码更加方便。请注意,在 dealloc 中,您仍然必须将 nil 应用于您的属性才能释放它存储的最后一个对象。
另一类属性,当它们的数据不是来自实例变量而是来自其他数据源(如数据库)时。例如,Core Data 的托管对象的自动生成的属性就是这样工作的。
最后,您还可以定义自己的 getter 和 setter。一个好主意,例如围绕一些常用的 NSUserDefaults
设置编写一个属性包装器,这将有助于其访问:
@interface Bar
@property (nonatomic, assign) NSString* foo;
@end
@implementation Bar
- (void) setFooNSString *)theFoo
{
[[NSUserDefaults standardUserDefaults] setObject:theFoo
forKey"settings.foo"];
}
- (NSString*) foo
{
return [[NSUserDefaults standardUserDefaults]
stringForKey"settings.foo"];
}
@end
myBar.foo = @"foobar"; // automatically persisted between application runs
另请阅读:Advanced memory management和 Declared properties in objective C
关于iPhone 实例变量问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9771434/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |