2

我主要是 C++ 开发人员,最近我正在编写 iPhone 应用程序。

iPhone 上的内存管理对我来说没问题,由于资源限制,鼓励使用引用计数器而不是深拷贝。

一件烦人的事情是我必须自己管理引用计数器:alloc 意味着 counter = 1; retain 表示 counter++,release 表示 counter--

我希望为 Cocoa Touch 编写一个类似于 shared_ptr 的类,所以我很少需要自己手动操作引用计数器。

我怀疑是否有任何现有的代码,我想听听一些建议,今天是我开始学习目标 c 的第五天

谢谢。

4

5 回答 5

1

你忘了案例4

[4] 你需要从方法中传递一个指向对象的指针作为返回值。

这就是您需要-autorelease 的地方。

我建议您在尝试这个小项目之前阅读内存管理规则并编写一些实际代码,以便您了解内存管理应该如何工作。

于 2010-07-22T14:16:51.360 回答
1

只要您首先学习内存管理规则,就没有真正的问题shared_ptr- 它可以在 C++ 上下文中为您提供帮助,但不会让所有权问题神奇地消失。
shared_ptr支持自定义释放器,因此如下:

@interface A : NSObject
- (void)f;
@end

@implementation A
- (void)dealloc { NSLog(@"bye"); [super dealloc]; }
- (void)f { NSLog(@"moo"); }
@end

void my_dealloc(id p) {
    [p release];
}

// ...
{
    shared_ptr<A> p([[A alloc] init], my_dealloc);
    [p.get() f];
}

...输出:


再见

......正如预期的那样。

如果您愿意,您可以使用辅助函数向用户隐藏释放器,例如:

template<class T> shared_ptr<T> make_objc_ptr(T* t) {
    return shared_ptr<T>(t, my_dealloc);
}

shared_ptr<A> p = make_objc_ptr<A>([[A alloc] init]);
于 2010-07-22T18:27:44.553 回答
1

iOS 5 中的自动引用计数将有效地使任何指向 Objective-c 对象的指针都像智能指针一样工作。保留/释放调用将由编译器在分配和释放时合成,除非您明确声明引用为弱引用,在这种情况下,当对象被释放时它们将自动归零。

我的建议是等待几个月。在此期间,您也许可以将类似的东西放在一起,但我建议不要这样做。一方面,它会很丑。例子:

 smart_ptr<id> array = make_smart_ptr( [NSMutableArray array] );

 NSUInteger count = [array count];            // won't work.
 count = [array.get() count];                 // works, but yuck.
 [array.get() setArray: anotherArray.get()];  // even more yuck.

此外,如果你的头文件中充满了 c++ 类,你将不得不在 Objective-C++ 中编译你的整个项目,这可能会给你带来问题,因为 Objective-C++ 不是 100% 与 Objective-C 代码兼容,而且不是所有的第三个-party 框架将与它正常工作。忘记与其他人共享您的代码。

做这样的事情可能是一个有趣的练习,但你不会想实际使用它。并注意在 Objective-C 中重新创建您最喜欢的 C++ 部分的诱惑。这些语言非常不同,你可能会花很多时间来做这件事,而不是花时间去学习你在 Objective-C 中可以做而在 C++ 中做不到的所有伟大的事情。

于 2011-07-08T17:58:55.967 回答
0

Cocoa 中的资源管理可能很棘手:有些 API 调用会自动保留引用,有些则不会,有些返回自动释放的对象,有些返回保留的对象。通过在 shared_ptr 类中屏蔽这一点,您将更有可能犯错误。我的建议是首先采取“正常”的可可路线,直到您有相当的经验。

于 2010-07-22T12:03:21.800 回答
0

你调查过[object autorelease]吗?也许这会让事情变得容易一些。

于 2010-07-22T14:23:50.217 回答