我确信可变范围的问题

时间:2011-09-30 14:50:51

标签: iphone objective-c ios

我基本上遇到了变量范围的问题。知道多种编程语言,我有时无法绕过obj-c。

在我的webviewcontroller类中,我有一个使用self.var

调用的变量

我还有一些引用修改后的UIAlertView的委托方法。为什么我不能在没有整个应用程序崩溃的情况下在这些方法中引用这个self.var?

我已经尝试了所有的东西,已经过了几天,现在我需要帮助!

谢谢!

编辑:

这是代码webviewcontroller.h

    #import "SBTableAlert.h"

    @interface WebViewController : UIViewController <SBTableAlertDelegate, SBTableAlertDataSource>{
            NSMutableArray *bookmarks;
    }
    @property (nonatomic, retain) NSMutableArray *bookmarks;

这里是.m(是的,我有一个@synthesize用于书签),这是在视图中加载

    NSMutableArray *tmpArray = [tmpDict objectForKey:@"myKey"];
    self.bookmarks = tmpArray;
    [tmpDict release];
    [tmpArray release];

    SBTableAlert *bookmarkAlert;

    bookmarkAlert = [[SBTableAlert alloc] initWithTitle:@"Jump to:" cancelButtonTitle:@"Back" messageFormat:nil];
    [bookmarkAlert.view setTag:1];
    [bookmarkAlert setDelegate:self];
    [bookmarkAlert setDataSource:self];

NSString *settingsicon = [[NSBundle mainBundle] pathForResource:@"gear" ofType:@"png"];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageWithContentsOfFile:settingsicon] style:UIBarButtonItemStylePlain target:bookmarkAlert action:@selector(show)];

后来我尝试调用self.bookmarks

    - (NSInteger)tableAlert:(SBTableAlert *)tableAlert numberOfRowsInSection:(NSInteger)section {
            return [self.bookmarks count];
    }

我在self.bookmarks计数中得到的错误是NSInvalidArgumentException

3 个答案:

答案 0 :(得分:1)

如果不看一些代码就很难回答。

就像Farmer_Joe问的那样,你是如何定义财产的?类似的东西:

@property (nonatomic, retain) MyVar *var;

不同
@property MyVar *var;

您如何分配var?

var = value;

不会启用保留,但这会(如果属性定义为“保留”):

self.var = value

编辑:根据您发布的新代码,您似乎过度释放了tmpArray。删除这一行:

[tmpArray release];

您不必释放tmpArray,因为此行不会保留它:

NSMutableArray *tmpArray = [tmpDict objectForKey:@"myKey"];

答案 1 :(得分:0)

通过变量我假设你的意思是ivar(实例变量)。您是否为ivar创建了@property,如果是,请提供代码。您是否为ivar提供了@synthesize声明?

如果不是,您可能需要提供它们。

self.var = x;将var的setter调用为:[var setVar:x];

假设该变量被设计为从类外部访问,请在.h文件中添加@property语句:

@property (nonatomic, retain) ClassName *var;

在关联的.m文件中添加:

@synthesize var;

在.m文件方法中,dealloc add:

[var release];

所有使用的应该访问var作为: 在定义类中:self.varinstantiatedVariable.var

引用的其他类中

考虑学习Apple的Memory Management Programming Guide,它将节省大量时间和挫折。

答案 2 :(得分:0)

我看到以下问题:

  • 不要这样做:[tmpArray release]。您没有对tmpArray的引用,它是自动释放的。

  • 您是否拥有tmpDict的参考资料? - 另外,这是一个糟糕的var名称;)

  • 您能否确认[tmpDict objectForKey:@"myKey"]返回一个数组?