ios - 圆点表示法、释放和解除分配

标签 ios objective-c memory-management

@界面:

UIImageView *myImageView;

@property (nonatomic, retain) UIImageView *myImageView;

@实现:

@synthesize myImageView;

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
}

myImageView 的引用计数是多少? 2(1 个来自 alloc,1 个来自点符号保留)或 3 个(1 个来自 alloc,1 个来自点符号保留,1 个来自@property retain)

这两个语句的引用计数是否相同?

self.myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];

myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];

此外,我假设您在 @implemenation 和 dealloc 方法中释放它们,对吗?


编辑:

我没有得到我想要的答案,可能我的问题含糊不清。我了解什么是点符号、@property、@synthesize,以及 setter 和 getter 的工作原理。我不明白的是使用“ self ”时会发生什么。没有“ self ”。关于保留计数。我实际上在 myImageView 对象上运行了 retainCount 方法,它确认了我的原始“ self ”。 case 的保留计数为两个(带有 alloc 和 property retain,所以在那里使用 autorelease 可能是个好主意)。现在这引出了另一个问题,如果我不使用自动释放,我该怎么做呢?在 viewDidLoad 中释放一次,在 dealloc 中再次释放,仍然会导致内存泄漏,对吗?

self.myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
NSLog(@"retain count dot: %d", [myImageView retainCount]);

2011-05-17 10:01:14.915 测试[1249:207] 保留计数点:2

myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
NSLog(@"retain count: %d", [myImageView retainCount]);

2011-05-17 10:03:14.715 测试 [1278:207] 保留计数:1

最佳答案

首先:您不应该对引用计数做出任何假设。充其量只会产生误导。

如果您使用属性访问 (self.myImageView = ...),那么它将自动保留,因此您在 viewDidLoad 中泄漏了 UIImageView。你应该使用类似的东西

self.myImageView = [[[UIMageView alloc] init.... ] autorelease];

你的最后一个例子(没有“点”访问)将直接修改 ivar,所以它不会泄漏这个新实例。 但是如果您之前不释放它,它会泄漏您覆盖的旧 imageView。

我强烈建议始终使用属性访问。并且不要忘记在 dealloc 中进行清理:

[myImageView release], myImageView = nil;

有些人更喜欢 self.myImageView = nil; 但这可能有副作用。

关于ios - 圆点表示法、释放和解除分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6019973/

相关文章:

ios - Swift:无法长按拖动单元格到 UICollectionViewController 和 UITableView 中的空白部分

iphone - 具有 playerduel 功能的应用程序不会收到推送通知

ios - 从详细 View Controller 返回时停止嵌入式 TableView 单元格中的 activityIndi​​cator

iphone - 如何移动 UITabBarItem 的标题?

iPhone - 收到内存警告

ios - 调试控制台中的 Xcode 7.3.1 '<could not resolve type>'

ios - 如何区分单击并按下UIButton iOS

objective-c - 如果您必须为文件夹使用自定义图标,您如何以编程方式将文件夹图标放在 Finder 侧边栏上?

c++ - Visual Studio 2010 C++ : Get size of memory block allocated by malloc

windows - 页面文件使用