我试图找出为什么我的NSTextFields
仅保留在第一种方法sendVarsToButton
中而不保留在updateTotal
方法中。我需要在第一种方法中访问TextField中的值,但我不能,因为看起来我的IBOutlets在sendVarsToButton
方法之后释放了自己。你能帮帮我吗??
这是我的.h
#import <Cocoa/Cocoa.h>
#import "TransactionViewController.h"
@class TransactionButtonModel;
@interface TransactionButtonController : TransactionViewController
{
NSMutableArray *buttonsArrays;
TransactionViewController *transactionViewController;
TransactionButtonModel *transactionButtonModel;
}
@property(nonatomic,retain) IBOutlet NSTextField *nom;
@property(nonatomic,retain) IBOutlet NSTextField *descriptionText;
@property(nonatomic,retain) IBOutlet NSTextField *prix;
@property(nonatomic,retain) IBOutlet NSTextField *CPUField;
@property(nonatomic,retain) IBOutlet NSTextField *quantite;
@property(nonatomic,retain) IBOutlet NSTextField *total;
-(void)sendVarsToButton:(NSString *)name:(NSString *)description:(double)price:(double)CPU:(long)tag;
-(void)updateTotal:(int)newQuantity;
-(void)addQuantiteToExistingProduct:(long)tag;
-(IBAction)removeProductFromView:(id)sender;
这是我的.m
#import "TransactionButtonController.h"
#import "TransactionViewController.h"
#import "TransactionButtonModel.h"
@implementation TransactionButtonController
@synthesize prix;
@synthesize nom;
@synthesize descriptionText;
@synthesize CPUField;
@synthesize total;
@synthesize quantite;
//In this method, everything works fine
-(void)sendVarsToButton:(NSString *)name :(NSString *)description :(double)price :(double)CPU:(long)tag
{
[nom setTag:tag];
[descriptionText setTag:tag];
[prix setTag:tag];
[CPUField setTag:tag];
[quantite setTag:tag];
[total setTag:tag];
nom.stringValue = name;
descriptionText.stringValue = description;
[prix setDoubleValue : price];
CPUField.doubleValue = CPU;
total.doubleValue = [TransactionButtonModel calculateButtonTotal:quantite.intValue :prix.doubleValue];
NSLog(@"retain! :%lu",[[prix viewWithTag:tag] retainCount]); // returns 2
[transactionButtonModel release];
}
-(void)updateTotal:(int)newQuantity
{
NSLog(@"retain! :%lu",[[prix viewWithTag:2] retainCount]); //returns 0
[total setDoubleValue:[TransactionButtonModel calculateButtonTotal:newQuantity :prix.doubleValue]]; // value of prix = 0 and prix = null
NSLog(@"Updated! :%i",newQuantity);
}
-(void)dealloc
{
[nom release];
[quantite release];
[prix release];
[total release];
[descriptionText release];
}
提前致谢。
答案 0 :(得分:1)
听起来你在这里遇到了一些问题。没有特别的顺序:
即使您没有在transactionButtonModel
创建sendVarsToButton:::::
,也会发布self
,并且您没有特别明显的理由。这似乎可能是一个内存管理错误,但没有上下文就很难说。
您正在寻找引用计数机制来查看变量为空的原因。过度释放对象不会将引用该对象的变量设置为null - 它只是一个垃圾指针,可能会使程序崩溃。变量意外为空的最可能原因是:a)以不同于预期的顺序运行的方法,或者b)您正在处理类的两个不同实例,就好像它们是相同的一样。在这种情况下,我的钱将在B上。您可能正在创建此类的两个实例,其中一个实际显示视图,另一个实际上是“空白”。尝试在两种方法中记录viewWithTag:tag
,看看它是否是同一个对象。
在一种方法中,您正在记录viewWithTag:2
,而在另一种方法中,您正在记录tag
- 这不一定是prix
为2的安全假设。
retainCount
是一个NSTextField - 你为什么要求它获取子视图? NSTextField通常不会有任何有用的子视图。这个设计似乎有些奇怪。
你的方法名称与所有那些冒号都是坚果。它很难阅读并经常导致错误(由于当你不是“当时”时可能误读代码而且它违反了语言的惯用语。)
您依靠retainCount
来跟踪内存管理。 retainCount
返回的值充其量是有问题的,并且通常是彻头彻尾的欺骗性因为事情会一直保留并自动释放,retainCount
不会为您提供足够的信息来解释这一点。如果你有一个内存管理问题(不似乎是这种情况,你的变量变为零),一个好的方法是使用Instruments和调试器来跟踪它,而不是随机{ {1}}日志记录。