• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

iPhone 实例变量问题

[复制链接]
菜鸟教程小白 发表于 2022-12-12 19:44:59 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我试图弄清楚将 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



Best Answer-推荐答案


当您在 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 managementDeclared properties in objective C

关于iPhone 实例变量问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9771434/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap