objective-c - 在不使用自引用的情况下设置 Objective-C 类属性

标签 objective-c iphone-sdk-3.0

今天早上我在我正在开发的 iPhone 应用程序中遇到了崩溃,当我修复这个错误时,我很好奇这是一个问题的语法原因。

这是我简化为简单元素的代码。我正在使用 NSArray 填充 TableView 中的项目。 NSArray 是一个属性:

@interface FooViewController : UITableViewController {
    NSArray *stuff;
}

@property (nonatomic, retain) NSArray *stuff;

在我的实现文件中:

@synthesize stuff;

- (void)viewDidLoad {     
    NSArray *arr = [[NSArray alloc] initWithObjects:@"", @"Item 1", @"Item 2",   
                                       @"Lorem", @"Ipsum", nil];
    self.stuff = arr;

    [arr release];
}

现在,当我第一次编写该方法时,我不小心遗漏了“self”。这导致了炸弹。虽然在测试时,它乍一看是有效的。我试过:

stuff = arr;
NSLog(@"%d", [stuff count]);

但是在其他方法中使用 stuff 遭到轰炸。现在我已经解决了这个问题,我可以在其他地方使用 [stuff count]。

那么为什么我可以在某些地方使用 stuff 而在其他地方我必须使用 self.stuff

最佳答案

当您使用 (self) 和点语法时,考虑到您定义属性 (nonatomic, retain) 的方式,NSArray (stuff) 将被保留。

如果不这样做,您仍然在进行赋值,但除了通过 alloc+init 进行的隐式保留之外,您并没有保留数组 - 您会立即释放它。

您可以通过以下方式绕过“self.stuff = arr”分配:

stuff = [arr retain];

但是既然你定义了一个属性,你显然想要使用点语法并为你调用保留。

关于objective-c - 在不使用自引用的情况下设置 Objective-C 类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1295702/

相关文章:

ios - 需要 UIBezierPath 的提示。像 Instagram 一样的三角形注册 View

ios - 如何安装与Xcode默认自带的sdk不同的sdk?

cocoa-touch - 横向显示 MFMailComposeViewController

iphone - 动态、本地化 NSString

ios - ios 中体系结构 x86_64 的 undefined symbol

ios - 为应用程序添加试用期。我应该在 Swift (iOS) 中使用 Timer 还是 DispatchQueue?

ios - Uber 是如何在 WatchKit 中实现这个 UI 的?

iphone - 如何将视频添加到 iPad 模拟器?

objective-c - 需要 CoreTelephony 框架示例

objective-c - 在 Swift 3 中使用 Objective C typedef 枚举时出错