【问题标题】:Cocoa : Objects allocated but not properly accessible?Cocoa:已分配但无法正确访问的对象?
【发布时间】:2012-04-05 12:04:42
【问题描述】:

这就是我所拥有的:

A 类:

#import "ppCore.h"

@interface ppApplication : NSApplication {
    ppCore* core;
}

@property (assign) ppCore* core;

@end


@implementation ppApplication

@synthesize core;

- (void)awakeFromNib
{
    [self setCore:[[[ppCore alloc] init] retain]];
}

B 类:

#import "someObject.h"
#import "anotherObject.h"

@interface ppCore : NSObject<NSApplicationDelegate>  {
    ppSomeObject* someObject;
    ppAnotherObject* anotherObject;
}

@property (assign) ppSomeObject* someObject;
@property (assign) ppAnotherObject* anotherObject;

@end


@implementation ppCore

@synthesize someObject, anotherObject;

- (void)applicationDidFinishLaunching:(NSNotification *)notification 
{
     [self setSomeObject:[[ppSomeObject alloc] init]];
     [self setAnotherObject:[[ppAnotherObject alloc] init]];
}

这就是问题所在:

在稍后的某个阶段,在ppApplication,我尝试访问core

core 在那里。

但是,当我尝试访问 core 的任何元素(例如 [core someObject])时,一切都变为 NULL(我已在调试器中检查过)...

我做错了什么??

【问题讨论】:

  • 您确定正在调用此[self setSomeObject:[[ppSomeObject alloc] init]]; 吗?如果是这样,你得到空值的代码是什么样的?
  • 而且,顺便说一句,您不需要在 [ppCore alloc]... 上额外保留,因为 alloc 已经这样做了。
  • 为什么会在 ppCore 对象上调用 - (void)applicationDidFinishLaunching:(NSNotification *)notification?
  • 您也不需要在 Application 类中设置 core,因为如果 ppCore 是您的应用程序的委托,则应用程序已经可以通过 delegate 属性访问它
  • 我建议你删除整个 core 东西,因为你可以通过 [[NSApplication sharedApplication] delegate] 访问你的委托,并将 someObjectanotherObject 的设置移动到委托的 init 方法。因为整个代码看起来过于复杂了,也许你已经把基本的 NSApplication 架构搞砸了,所以出了点问题

标签: objective-c cocoa object memory-management alloc


【解决方案1】:

您是否尝试过像这样声明您的对象:

@property (nonatomic, retain) ppCore* core;

@property (nonatomic, retain) ppSomeObject* someObject;
@property (nonatomic, retain) ppAnotherObject* anotherObject;

【讨论】:

  • +1 -- assign 属性只创建一个setter,而不是一个getter。更多详情stackoverflow.com/questions/918698/…
  • 哇! 'assign' 仅描述存储;如果您合成一个“分配”属性,仍然有一个吸气剂。对于一个简单的分配和合成属性,类似于 `self.whoAmI = @"ViewController"; NSLog(@"%@", self.whoAmI);'工作正常。
【解决方案2】:

我建议你删除整个 core 东西,因为你可以通过 [[NSApplication sharedApplication] delegate] 访问你的委托,并将 someObject 和 anotherObject 的设置移动到委托的 init 方法。

【讨论】:

  • 非常感谢。您的建议使我稍微清理了代码;现在,事情似乎进展顺利!...
【解决方案3】:

Antonio 是对的,你也需要管理内存,

    #import "ppCore.h"

    @interface ppApplication : NSApplication {
        ppCore* core;
    }

    @property (nonatomic, retain) ppCore* core;

    @end


    @implementation ppApplication

    @synthesize core;

    - (void)awakeFromNib
    {
        ppCore* tempCore = [[ppCore alloc] init];   
        [self setCore: tempCore];
        [tempCore release];
    }

这可能会有所帮助。

【讨论】:

  • 请将您的代码发布在您实际使用此变量的位置。
【解决方案4】:

为什么您认为您的 ppCore 对象上的- (void)applicationDidFinishLaunching: 会被调用?在我看来,您必须从某个地方显式调用它。

【讨论】:

    猜你喜欢
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2011-03-25
    相关资源
    最近更新 更多